Wpf 强制调用HwndHost派生类的BuildWindowCore成员

Wpf 强制调用HwndHost派生类的BuildWindowCore成员,wpf,visibility,hwndhost,Wpf,Visibility,Hwndhost,我使用从HwndHost派生的类来承载Win32窗口。它依次在用户控件中使用。除非成功创建内部Win32窗口,否则该用户控件不会显示可见性。但是,除非HwndHost窗口可见,否则BuildWindowCore方法似乎不会被调用,因此我遇到了鸡和蛋的情况 如果HwndHost派生的类不可见,是否有另一种方法可以获取其名为BuildWindowCore的方法?嗯,一个月过去了,没有任何答案。看来我已经把每个人都难倒了,包括我自己 因此,到.NET 4.0为止,答案是否定的,在框架准备好调用Buil

我使用从HwndHost派生的类来承载Win32窗口。它依次在用户控件中使用。除非成功创建内部Win32窗口,否则该用户控件不会显示可见性。但是,除非HwndHost窗口可见,否则BuildWindowCore方法似乎不会被调用,因此我遇到了鸡和蛋的情况


如果HwndHost派生的类不可见,是否有另一种方法可以获取其名为BuildWindowCore的方法?

嗯,一个月过去了,没有任何答案。看来我已经把每个人都难倒了,包括我自己


因此,到.NET 4.0为止,答案是否定的,在框架准备好调用BuildWindowCore之前,没有办法强制调用它。

您可以自己创建Win32窗口,只需使用HwndHost作为包装器,如下面的示例所示

ref class MyHost : HwndHost 
{
private:
   HWND  m_hWnd;
public:
   MyHost(HWND hWnd)
   {
      m_hWnd = hWnd;
   }
protected: 
  virtual HandleRef BuildWindowCore(HandleRef hwndParent) override 
  {
     // Simply re-parent the window
     SetParent(m_hWnd, (HWND) hwndParent.Handle.ToPointer());
     return HandleRef(this, (IntPtr) m_hWnd);
  } 

  virtual void DestroyWindowCore(HandleRef hwnd) override
  {
     ::DestroyWindow(m_hWnd);
  }
};

为什么要先创建Win32窗口?你是否期望这个过程会以某种方式失败?简言之,是的,它的创建可能会失败。从长远来看,它与我们的遗留代码以及它如何工作有关。这实际上可能是可行的。今天早上我突然觉得自己像个初级程序员,因为我自己没有想到这一点。谢谢。现在我想起来为什么我不能这样做了。非托管窗口将创建其他子窗口,消息开始在它们之间四处传播。我需要在MyHost中处理其中一些。这就是为什么我在构建WindowCore之前无法创建窗口。尽管我在一篇旧文章中想添加一条评论。当我尝试上述方法时,当我调用BuildWindowCore时,我遇到了一个问题。我怀疑BuildWindowCore被WPF消息处理循环调用,而BuildWindowCore以某种方式结束了等待处理循环处理消息的过程。然而,我一点也不确定这一点,只是想让读过这篇文章的人知道,你可能会看到同样的情况