Кажется, нет идеального решения. Я немного изменил свой подход по сравнению со временем задаваемого вопроса:
В конструкторе моего класса, производного от HwndHost, у меня есть (возможный) родительский hWnd в качестве одного из параметров. Затем я создаю собственное окно, используя собственный метод CreateWindow()
, используя данный родительский hWnd. Я храню созданный hWnd в отдельном свойстве, которое я использую везде вместо свойства HwndHost's Handle. Таким образом, мне не нужно показывать окно (это решает ограничение № 2).
В переопределенном методе BuildWindowCore()
я сравниваю данный родительский hWnd с тем, который мне дали в конструкторе. Если они отличаются, я перерисовываю свое размещенное окно, используя собственный метод SetParent()
(это решает ограничение # 1). Обратите внимание, что никто не хранит родительский hWnd!
В коде соответствующие части (проверки опущены):
public class Win32Window : HwndHost
{
public Win32Window(IntPtr parentHwnd)
{
this.ParentHwnd = parentHwnd;
this.Win32Handle = NativeMethods.CreateWindowEx( /* parameters omitted*/ );
}
public IntPtr Win32Handle { get; private set; }
private IntPtr ParentHwnd { get; set; }
protected override HandleRef BuildWindowCore(HandleRef hwndParent)
{
if (hwndParent.Handle != this.ParentHwnd)
{
NativeMethods.SetParent(this.Win32Handle, hwndParent.Handle);
}
return new HandleRef(this, this.Win32Handle);
}
}