ShowDialog()在父窗口后面

问题描述:

我使用ShowDialog()WindowStyle = WindowStyle.SingleBorderWindow;在我的WPF(MVVM)应用程序中打开模式窗口,但它使我可以使用Windows任务栏(Windows 7)导航到父窗口。ShowDialog()在父窗口后面

我在这里找到了答案:WPF and ShowDialog()但它不适合我,因为我不需要“总是在最上面”工具窗口。

在此先感谢

尝试设置对话框的Owner财产。这应该工作。

Window dialog = new Window(); 
dialog.Owner = mainWindow; 
dialog.ShowDialog(); 

编辑: 我用这个与MVVM类似的问题。你可以通过使用委托来解决这个问题。

public class MainWindowViewModel 
{ 
    public delegate void ShowDialogDelegate(string message); 
    public ShowDialogDelegate ShowDialogCallback; 

    public void Action() 
    { 
     // here you want to show the dialog 
     ShowDialogDelegate callback = ShowDialogCallback; 
     if(callback != null) 
     { 
      callback("Message"); 
     } 
    } 
} 

public class MainWindow 
{ 
    public MainWindow() 
    { 
     // initialize the ViewModel 
     MainWindowViewModel viewModel = new MainWindowViewModel(); 
     viewModel.ShowDialogCallback += ShowDialog; 
     DataContext = viewModel; 
    } 

    private void ShowDialog(string message) 
    { 
     // show the dialog 
    } 
} 
+0

谢谢,这个想法很好。现在唯一的问题是在ViewModel中我没有View的信息。 我试过'App.Current.MainWindow',它可以工作,但不是最好的解决方案。也许我应该重新考虑我的MVVM模式的结构。 – Oszkar 2012-03-25 08:11:38

+1

我为MVVM问题添加了一个可能的解决方案。 – MatthiasG 2012-03-25 11:34:39

+0

@Oszkar我使用'Application.Current.MainWindow'(应用程序而不是应用程序),因为它是静态的 - 我猜 - 它工作正常,没有令人不安的MVVM。 – heltonbiker 2017-02-24 12:38:51

添加“ShowInTaskbar”并将其设置为false。

当父窗口使(并显示)子窗口时,这是您需要设置所有者的位置。

public partial class MainWindow : Window 
{ 

    private void openChild() 
    { 
     ChildWindow child = new ChildWindow(); 
     child.Owner = this; // "this" is the parent 
     child.ShowDialog(); 
    } 
} 

的方法,另外,如果你不想为所有的孩子一个额外的任务栏......然后

<Window x:Class="ChildWindow"   
     ShowInTaskbar="False" > 
</Window> 
+0

如果'this'不是一个Window?我从MFC运行WPF,所以我没有应用程序或主窗口。 – 2014-06-10 07:50:38

+0

你想打开什么?只需显示一个对话框? 如果您不想将对话框附加到窗口,我不明白您的问题。 – 00jt 2014-07-09 21:03:42

+0

正如我所说的,“从MFC”... MFC类不是从WPF的窗口派生。我最近发现WindowInteropHelper.Owner ......尽管如此,我们最终还是隐藏了模态对话框。 – 2014-07-10 04:03:27

我有这个问题,但作为窗口正从我没视图模型打开没有对当前窗口的引用。为了避开它,我用这个代码:

var myWindow = new MyWindowType(); 
myWindow.Owner = Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive); 

您可以使用:myWindow.Owner = Application.Current.MainWindow;

但是,这种方法会导致问题,如果你有三个窗口打开这样的:

MainWindow 
    | 
    -----> ChildWindow1 

       | 
       -----> ChildWindow2 

然后设置ChildWindow2 .Owner = Application.Current.MainWindow会将窗口的所有者设置为其祖父窗口,而不是父窗口。

即使这篇文章有点老,我希望我发布我的解决方案是可以的。 以上所有结果都是我所知道的,并没有完全达到预期的结果。

我这样做是为了其他的Google :)

比方说f2是要显示在F1的顶端的窗口:

f2.Owner = Window.GetWindow(this); 
f2.ShowDialog(); 

就是这样,我保证它不会消失!

HTH 盖伊

大部分为MVVM模式的理由是,这样的交互逻辑可以单元测试。出于这个原因,你不应该直接从ViewModel打开一个窗口,否则你会在单元测试中弹出对话框。

相反,您应该提出一个事件,视图将处理并为您打开一个对话框。例如,请参阅交互式请求上的这篇文章:https://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspx#sec12