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