4

我有两个 WPF 应用程序和一个进程管理器,它们将数据从第一个 WPF 应用程序传递到第二个 WPF 应用程序,反之亦然。在一个用例中,我必须以模态模式在第二个应用程序的窗口(主窗口)上显示第一个应用程序的窗口(主窗口)。因此,第二个 WPF 应用程序的窗口将被禁用,并在第一个 WPF 应用程序的窗口顶部显示。所需的行为与在单个 WPF 应用程序中以模式模式显示窗口相同。知道如何从另一个 WPF 应用程序访问一个 WPF 应用程序的窗口吗?

在 Winform 应用程序的情况下,我们通过将 Window Handle(intPtr) 传递给另一个应用程序并在模式模式下显示窗口时使用如下句柄来完成它:

System.Windows.Forms.Form.ShowDialog(System.Windows.Forms.IWin32Window)

在 WPF 应用程序的情况下,如何实现类似的事情?提前致谢。

4

2 回答 2

4

=========================== 开始更新 ===================== =================

代码:

using System.Windows; // Window, WindowStartupLocation
using System.Windows.Interop; // WindowInteropHelper
using System.Runtime.InteropServices; // DllImport
...

// Instantiate the owned WPF window
CenteredWindow cw = new CenteredWindow();
// Get the handle to the non-WPF owner window
IntPtr hWnd = ...

CenteredWindow cw = new CenteredWindow();

EnableWindow(hWnd, false); // disable parent window
try
{
    // Set the owned WPF window’s owner with the non-WPF owner window
    WindowInteropHelper helper = new WindowInteropHelper(cw);
    helper.Owner = hWnd;
    cw.ShowDialog();
}
finally
{
    EnableWindow(hWnd, true); // enable parent window
}

...
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool EnableWindow(IntPtr hwnd, bool enable);

在@kamal-nayan 评论中的MS Connect Link的帮助下,我修改了上面的代码,它对我来说效果很好。

关键是禁用父窗口,当你的模态对话框关闭时,启用父窗口。

============================ 结束更新===================== =================

using System.Windows; // Window, WindowStartupLocation
using System.Windows.Interop; // WindowInteropHelper
...
// Instantiate the owned WPF window
CenteredWindow cw = new CenteredWindow();

// Get the handle to the non-WPF owner window
IntPtr ownerWindowHandle = ...; // Get hWnd for non-WPF window

// Set the owned WPF window’s owner with the non-WPF owner window
WindowInteropHelper helper = new WindowInteropHelper(cw);
helper.Owner = ownerWindowHandle;
cw.ShowDialog();

这是我找到的唯一解决方案。这不是真正的模态,即您仍然可以激活父窗口,但好在子窗口仍然在父窗口之上。

http://blogs.msdn.com/b/wpfsdk/archive/2007/04/03/centering-wpf-windows-with-wpf-and-non-wpf-owner-windows.aspx

于 2014-03-27T02:54:16.847 回答
0
_parameters = new HwndSourceParameters("myWindow");

_parameters.WindowStyle = WindowStyles.WS_SYSMENU | WindowStyles.WS_VISIBLE | WindowStyles.WS_CAPTION | WindowStyles.WS_CHILD | WindowStyles.WS_POPUP;
_parameters.SetPosition(50, 50);

_parameters.ParentWindow = ParentWindowHandle;           
_hwndSource = new HwndSource(_parameters);

_hwndSource.SizeToContent = SizeToContent.WidthAndHeight;
_hwndSource.RootVisual = modalWindowContent;

这就是我能够将一个进程的窗口作为模态显示到另一个进程的窗口的方式。

于 2014-03-27T11:07:58.013 回答