MFC对话框上的WPF用户控件每隔一段时间显示隐藏
Posted
技术标签:
【中文标题】MFC对话框上的WPF用户控件每隔一段时间显示隐藏【英文标题】:WPF User Control On MFC Dialog Showing Hidden Every Once and a While 【发布时间】:2011-07-28 15:23:56 【问题描述】:我遇到了一个非常奇怪的问题,我想看看其他人是否见过。我有一个 C++ 应用程序(使用 CLR 支持编译),它有一个托管 WPF 用户控件的 MFC 对话框。每隔一段时间,当对话框打开时 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();
这当然是一个奇怪的问题。我的一些用户从未见过它,而另一些用户一天会发生很多次。
在显示 WPF 控件方面感觉像是 MFC 中的一个错误。但是,我在网上搜索过,从未听任何人描述过这个问题。代码没有抛出任何异常,所以我不确定问题可能是什么。
我很困惑,如果能深入了解这个问题,我将不胜感激。
【问题讨论】:
【参考方案1】:WPF 不会像 MFC 或 WinForms 那样将这些东西绘制为 Windows 控件 - 您可以使用 Spy++ 检查它。这就是为什么不能/容易混合 WPF 和 MFC。
【讨论】:
以上是关于MFC对话框上的WPF用户控件每隔一段时间显示隐藏的主要内容,如果未能解决你的问题,请参考以下文章