MFC对话框上的WPF用户控件显示隐藏每一次和一段时间

时间:2011-07-28 15:23:57

标签: wpf mfc

我遇到了一个非常奇怪的问题,我想知道是否有其他人见过。我有一个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控件的错误一样。但是,我已经在网上搜索过,从未听过有人描述过这个问题。代码没有抛出任何异常,所以我不确定问题是什么。

我很难过,并希望能够深入了解这个问题。

1 个答案:

答案 0 :(得分:0)

WPF不像MFC或WinForms那样绘制窗口控件 - 你可以使用Spy ++来检查它。这就是为什么它不可能/容易混合WPF和MFC。