Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使WPF窗口在通过Process类启动时表现为DialogWindow_C#_Wpf_Mvvm - Fatal编程技术网

C# 如何使WPF窗口在通过Process类启动时表现为DialogWindow

C# 如何使WPF窗口在通过Process类启动时表现为DialogWindow,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个小的WPF应用程序,比如SubWPF,它最初显示一个主窗口,允许用户浏览文件。我在另一个应用程序(如MainWPF)上单击按钮启动此wpf应用程序。简而言之,当我单击“Launch Sub”时,SubWPF.exe将通过下面给出的流程类从MainWPF启动 Process p = new Process(); p.StartInfo.FileName = "SubWPF.exe"; p.StartInfo.WindowStyle = ProcessWi

我有一个小的WPF应用程序,比如SubWPF,它最初显示一个主窗口,允许用户浏览文件。我在另一个应用程序(如MainWPF)上单击按钮启动此wpf应用程序。简而言之,当我单击“Launch Sub”时,SubWPF.exe将通过下面给出的流程类从MainWPF启动

Process p = new Process();
p.StartInfo.FileName = "SubWPF.exe";
       
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
p.StartInfo.UseShellExecute = false;
p.StartInfo.Verb = "runas";
p.Start();

问题在后台,我有MainWPF窗口。我需要子WPF始终位于顶部,并防止用户单击mainwpf的背景按钮。准确地说,需要实现showdialog()的行为。我不能对我的子WPF使用
TopMost=true
,因为一旦用户在主窗口中选择一个文件,该窗口将关闭,并显示另一个显示文件内容的窗口。设置
TopMost=true
不允许我关闭文件选择窗口。

如果您将子窗口最大化到父窗口的大小,您将无法获得此答案,但您可以阻止主窗口进行输入(现在就想到了——你可以制作一个透明的背景,并将你的实际业务控制放在子窗口的中心)。
另一个陷阱是调整主窗口大小的可能性——要绕过它,您可以尝试更改主窗口样式:。
除了最大化,您还可以捕获鼠标并在每次单击时将子窗口移到顶部,或者致电开发团队并按照Leonid Malyshev在评论中提供的方式进行操作。 因此,您需要为
窗口添加一些逻辑。为子窗口加载子窗口结束集
WindowStyle=“None”
的事件处理程序:

using System.Runtime.InteropServices;

[DllImport("user32.dll")]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport("user32.dll")]
public static extern IntPtr SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);

private void SubWindow_Loaded(object sender, RoutedEventArgs e)
{
    var p = Process.GetProcessesByName("YourMainWindow")[0];

    SetParent(new WindowInteropHelper(this).Handle, p.MainWindowHandle);

    WindowState = WindowState.Maximized; //Does maximize sub window to the size of parent window.

    IntPtr HWND_TOPMOST = new IntPtr(-1);
    const short SWP_NOACTIVATE = 0x0010;

    SetWindowPos(new WindowInteropHelper(this).Handle, p.MainWindowHandle, 0, 0, (int)Width, (int)Height, SWP_NOACTIVATE);
}

将MainWPF和restore byProcess的IshittesVisible设置为false。已退出事件是否还有其他选择。由于MainWPF是由另一个团队实现的主要应用程序,我很难对其进行更改。