2012-03-24 94 views
6

我使用ShowDialog()WindowStyle = WindowStyle.SingleBorderWindow;在我的WPF(MVVM)應用程序中打開模式窗口,但它使我可以使用Windows任務欄(Windows 7)導航到父窗口。ShowDialog()在父窗口後面

我在這裏找到了答案:WPF and ShowDialog()但它不適合我,因爲我不需要「總是在最上面」工具窗口。

在此先感謝

回答

9

嘗試設置對話框的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

0

添加「ShowInTaskbar」並將其設置爲false。

1

當父窗口使(並顯示)子窗口時,這是您需要設置所有者的位置。

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

2

我有這個問題,但作爲窗口正從我沒視圖模型打開沒有對當前窗口的引用。爲了避開它,我用這個代碼:

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會將窗口的所有者設置爲其祖父窗口,而不是父窗口。

0

即使這篇文章有點老,我希望我發佈我的解決方案是可以的。 以上所有結果都是我所知道的,並沒有完全達到預期的結果。

我這樣做是爲了其他的Google :)

比方說f2是要顯示在F1的頂端的窗口:

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

就是這樣,我保證它不會消失!

HTH 蓋伊

0

大部分爲MVVM模式的理由是,這樣的交互邏輯可以單元測試。出於這個原因,你不應該直接從ViewModel打開一個窗口,否則你會在單元測試中彈出對話框。

相反,您應該提出一個事件,視圖將處理併爲您打開一個對話框。例如,請參閱交互式請求上的這篇文章:https://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspx#sec12

相關問題