У меня есть приложение WPF, которое я хочу, чтобы оно размещалось внутри другого приложения, отличного от WPF. В реальной жизни это приложение, отличное от WPF, является ActiveX внутри Internet Explorer, но для иллюстрации проблемы я использую простое приложение Windows Forms.Хостинг WPF-приложения внутри приложения, отличного от WPF, с использованием WIn32 SetParent()
Я использую функцию Windows API SetParent, на которой уже есть десятки потоков. Тем не менее, я не могу найти что-либо написанное по моей точной проблеме: Небольшая область справа и внизу приложения WPF не раскрашена внутри окна приложения не WPF.
скользящего окна WPF сам по себе:
окна WPF с окном Winform приложения в качестве родителя:
не испытывает проблемы, если своп приложения WPF с WinForms или простое приложение Win32 (например, Блокнот).
Код WinForm выглядит следующим образом:
private void Form1_Load(object sender, EventArgs e)
{
// Start process
var psi = new ProcessStartInfo("c:\\wpfapp\\wpfapp\\bin\\Debug\\wpfapp.exe");
psi.WindowStyle = ProcessWindowStyle.Normal;
_process = Process.Start(psi);
// Sleep until new process is ready
Thread.Sleep(1000);
// Set new process's parent to this window
SetParent(_process.MainWindowHandle, this.Handle);
// Remove WS_POPUP and add WS_CHILD window style to child window
const int GWL_STYLE = -16;
const long WS_POPUP = 0x80000000;
const long WS_CHILD = 0x40000000;
long style = GetWindowLong(_process.MainWindowHandle, GWL_STYLE);
style = (style & ~(WS_POPUP)) | WS_CHILD;
SetWindowLong(_process.MainWindowHandle, GWL_STYLE, style);
// Move and resize child window to fit into parent's
MoveWindow(_process.MainWindowHandle, 0, 0, this.Width, this.Height, true);
}
Примечание: Я знаю, что такое использование SetParent не обязательно рекомендуемая практика, но я хочу, и нужно выяснить, как это сделать это путь, поэтому, пожалуйста, дайте мне :)
Я должен добавить, что, как мне кажется, MoveWindow вызывает «обрезку». До этого все в порядке, но WPF, очевидно, имеет неправильное положение и размер. – jonsb
Не было бы проще использовать Silverlight? – TeaDrivenDev
Я не вижу, где вы устанавливаете размер родительского окна, и это явно слишком мало. Вам нужно изменить размер родительского окна, чтобы после вычитания неклиентской области клиентская область была размером, необходимым для вашего приложения WPF. –