我目前正在WPF中托管Win32 OSG(基于OpenGL构建)控件。我正在使用telerik库。当窗格与MainWindow对接时,一切正常。但是,当我撕下标签时, OSG图形不会在撕下标签中重新创建。
我是HwndHost
的子类,它使用CreateWindowEx
创建本机Win32主机并返回本机句柄(请参阅下面的代码)。然后,我将该句柄传递给由用户控件托管的本机OSG代码。
// inside my ControlHost class which derives from HwndHost
protected override HandleRef BuildWindowCore(HandleRef hwndParent)
{
hwndControl = IntPtr.Zero;
hwndHost = IntPtr.Zero;
hwndHost = CreateWindowEx(0, "MDIClient", "",
WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
0, 0,
hostHeight, hostWidth,
hwndParent.Handle,
(IntPtr)HOST_ID,
IntPtr.Zero,
0);
return new HandleRef(this, hwndHost);
}
按照预期调试上述方法时,hwndParent.handle
参数是选项卡停靠在主窗口中时WPF MainWindow的句柄。但是,当我拉出标签并且它变成浮动标签时,hwndParent.handle
属性是我用Spy ++找不到的值。根据Spy ++的浮动标签'hwnd`值与上述方法生成的相同。我怀疑这可能是OSG图形没有显示的原因。
我的问题是:
我原生地知道WPF只有一个与每个Window对象关联的HWND,但是如何在停靠库中使用浮动面板?浮动面板实际上是一个窗口作为底层对象还是用户控件?
为什么我的原生OSG图形没有显示在浮动撕下标签上?它是否与传入的父句柄有关?
答案 0 :(得分:4)
RadDocking控件默认使用透明WPF窗口显示其ToolWindows,并且作为WPF的平台限制,您无法在此类透明窗口中显示任何非WPF内容。你可以做的是通过将ToolWindow的RadWindowInteropHelper.AllowTransparency附加属性设置为False来使窗口不透明。这可以使用自定义的GeneratedItemsFactory来实现。请参考this forum thread作为示例项目。
此致 Miroslav Nedyalkov, Telerik团队。