我遇到了一个非常奇怪的问题,我想知道是否有其他人见过。我有一个C ++应用程序(使用CLR支持编译),它有一个MFC对话框,它托管一个WPF用户控件。每隔一段时间,当对话框打开时,WPF用户控件将不会出现。控件就在那里,因为我可以按下该用户控件上的按钮。显然,我看不到它,但如果单击按钮所在的区域,按钮仍会响应单击事件。
所有这一切的奇怪之处在于它是如何发生零星的。有时它会在用户第一次在启动应用程序后进入对话框时发生。其他时候,它会在成功进入对话框几次后发生。我们肯定没有找到任何模式何时会发生。它只发生过一次。此外,我们已经在所有不同的操作系统中看到了这一点 - XP,Vista和Win7。
要解决问题,只需关闭应用程序并重新启动它就可以解决问题。
就代码而言,正在使用MFC对话框上WPF用户控件的标准方法:
// Create the initial object
System::Windows::Interop::HwndSourceParameters^ sourceParams = gcnew System::Windows::Interop::HwndSourceParameters ("BatchSelectionContainer");
sourceParams->PositionX = x;
sourceParams->PositionY = y;
sourceParams->Height = height;
sourceParams->Width = width;
sourceParams->ParentWindow = System::IntPtr(parent);
sourceParams->WindowStyle = WS_VISIBLE | WS_CHILD;
BatchSelectionDialogGlobals::gHwndSource = gcnew System::Windows::Interop::HwndSource(*sourceParams);
BatchSelectionDialogGlobals::gHwndSource->AddHook(gcnew HwndSourceHook(ChildHwndSourceHook));
// Save a reference to the new frame
BatchSelectionDialogGlobals::BatchSelectionFrame = gcnew ProteinSimple::ParticleDetection::Console::BatchSelection();
// Establish an event handler for the buttons
BatchSelectionDialogGlobals::BatchSelectionFrame->EnableExecuteButton += gcnew ProteinSimple::ParticleDetection::Console::BatchSelection::GeneralHandler(&BatchSelectionDialog::EnableExecuteButton);
BatchSelectionDialogGlobals::BatchSelectionFrame->DisableExecuteButton += gcnew ProteinSimple::ParticleDetection::Console::BatchSelection::GeneralHandler(&BatchSelectionDialog::DisableExecuteButton);
// Finalize the visual parts and return the handle
BatchSelectionDialogGlobals::gHwndSource->RootVisual = BatchSelectionDialogGlobals::BatchSelectionFrame;
return (HWND) BatchSelectionDialogGlobals::gHwndSource->Handle.ToPointer();
这当然很奇怪。我的一些用户从未见过它,而其他用户每天都会发生多次。
感觉就像MFC中显示WPF控件的错误一样。但是,我已经在网上搜索过,从未听过有人描述过这个问题。代码没有抛出任何异常,所以我不确定问题是什么。
我很难过,并希望能够深入了解这个问题。
答案 0 :(得分:0)
WPF不像MFC或WinForms那样绘制窗口控件 - 你可以使用Spy ++来检查它。这就是为什么它不可能/容易混合WPF和MFC。