Ich habe eine WPF-Anwendung, die so aussieht, als wäre sie in einer anderen - nicht WPF - Anwendung gehostet. Im echten Leben ist diese Nicht-WPF-App ein ActiveX im Internet Explorer, aber um das Problem zu veranschaulichen, verwende ich eine einfache Windows Forms App.
Ich verwende die Windows-API-Funktion SetParent, auf der bereits Dutzende von Threads laufen. Ich kann jedoch nichts zu meinem genauen Problem finden: Eine kleine Region rechts und unten in der WPF-App wird nicht im Fenster der Nicht-WPF-App angezeigt .
Das WPF-Fenster selbst läuft:
Das WPF-Fenster mit dem Fenster der WinForm-Anwendung als übergeordnetes Element:
Ich erlebe das Problem nicht, wenn ich die WPF-App gegen eine WinForms-App oder eine einfache Win32-App (wie Notepad) vertausche.
Der WinForm-Code sieht folgendermaßen aus:
%Vor%Hinweis: Mir ist bewusst, dass diese Verwendung von SetParent nicht unbedingt eine empfohlene Übung ist, aber ich möchte und muss herausfinden, wie es auf diese Weise funktioniert, also lassen Sie mich bitte:)
Ich habe einen Workaround gefunden, der ziemlich gut funktioniert: Rufen Sie MoveWindow vor SetParent auf:
%Vor%In der SizeChanged-Ereignisbehandlungsroutine nehme ich das Kind aus dem übergeordneten Objekt, rufe MoveWindow auf und verschiebe es zurück in das Elternobjekt. Um das Flackern zu reduzieren, verberge ich das Fenster während dieser Operationen:
%Vor%es erklärt nicht, warum MoveWindow nach SetParent nicht funktioniert, aber es löst mein Problem, also werde ich dies als die Antwort markieren, es sei denn, etwas Besseres kommt auf.
Sie sollten wahrscheinlich Ihr WPF-Fenster so anpassen, dass es in Client-Bereich des neuen übergeordneten Fensters:
%Vor%Ich habe ein Formular / UserControl mit einem Panel verwendet. Dann habe ich das Panel als neues Elternelement verwendet und die neue Position und Größe des Panels mit SetWindowPos auf das untergeordnete Fenster gesetzt.
Hinweis: MS empfiehlt, SetWindowPos nach dem Verwenden von SetWindowLong (oder SetWindowLongPtr) zu verwenden, um die neuen Formatvorlagen zu aktivieren.