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用户控件每隔一段时间显示隐藏的主要内容,如果未能解决你的问题,请参考以下文章

c#中如何保证每隔一段时间执行一个动作。

vb怎么每隔一秒自动点击按钮

c#每隔一段时间执行一次函数

如何在 MFC 中的对话框上阻止鼠标输入

c#中如何保证每隔一段时间执行一个动作,即实现刷新功能?

观察 currentPlaybackTime 并每隔一段时间显示一个覆盖