我使用ShowDialog()
和WindowStyle = WindowStyle.SingleBorderWindow;
在我的WPF(MVVM)應用程序中打開模式窗口,但它使我可以使用Windows任務欄(Windows 7)導航到父窗口。ShowDialog()在父窗口後面
我在這裏找到了答案:WPF and 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
}
}
添加「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>
如果'this'不是一個Window?我從MFC運行WPF,所以我沒有應用程序或主窗口。 – 2014-06-10 07:50:38
你想打開什麼?只需顯示一個對話框? 如果您不想將對話框附加到窗口,我不明白您的問題。 – 00jt 2014-07-09 21:03:42
正如我所說的,「從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
謝謝,這個想法很好。現在唯一的問題是在ViewModel中我沒有View的信息。 我試過'App.Current.MainWindow',它可以工作,但不是最好的解決方案。也許我應該重新考慮我的MVVM模式的結構。 – Oszkar 2012-03-25 08:11:38
我爲MVVM問題添加了一個可能的解決方案。 – MatthiasG 2012-03-25 11:34:39
@Oszkar我使用'Application.Current.MainWindow'(應用程序而不是應用程序),因爲它是靜態的 - 我猜 - 它工作正常,沒有令人不安的MVVM。 – heltonbiker 2017-02-24 12:38:51