父窗口后面的ShowDialog()

时间:2012-03-24 21:53:45

标签: wpf showdialog

我正在使用ShowDialog()WindowStyle = WindowStyle.SingleBorderWindow;在我的WPF(MVVM)应用程序中打开一个模态窗口,但它允许我使用Windows任务栏(Windows 7)导航到父窗口。

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

提前致谢

7 个答案:

答案 0 :(得分:10)

尝试设置对话框的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
    }
}

答案 1 :(得分:2)

我有这个问题,但是当从视图模型打开Window时,我没有对当前窗口的引用。为了解决这个问题,我使用了这段代码:

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将窗口的所有者设置为祖父窗口,而不是父窗口。

答案 2 :(得分: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>

答案 3 :(得分:0)

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

答案 4 :(得分:0)

即使这篇文章有点陈旧,我希望我发布我的解决方案是可以的。 所有上述结果都为我所知,并没有完全产生预期的结果。

我正在为其他googlers做这件事:)

让我们说f2是你要在f1上显示的窗口:

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

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

HTH 盖

答案 5 :(得分:0)

MVVM模式的大部分原因是您的交互逻辑可以进行单元测试。因此,您不应该直接从ViewModel打开一个窗口,否则您将在单元测试中弹出对话框。

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

答案 6 :(得分:0)

问题似乎Window.Owner有关,并且确实,如果您根据以前的知识判断自己可能拥有Win32 API和WinForms,那么典型的原因就是缺少所有者问题,但正如许多人指出的那样,在WPF中不是这样。 Microsoft不断进行更改以使事情变得有趣。

在WPF中,您可以有一个具有特定所有者的对话框,并且仍然可以使该对话框出现在任务栏中。因为为什么不。这是默认行为。因为为什么不。他们的理由是模态对话框不再适用,所以您不应该使用它们。您应该使用无模式对话框,该对话框可以显示为单独的任务栏图标,并且在任何情况下,用户都可以决定是否要将不同的应用程序窗口视为单独的图标,或者是否希望将它们分组查看。

因此,他们正试图完全忽略所有可能违反其准则并创建模式对话框的人来执行此策略。因此,它们迫使您明确声明您不希望在对话框中显示任务栏图标。

要解决此问题,请在视图类的构造函数中执行以下操作:

ShowInTaskbar = false;

(这可能在InitializeComponent();之后出现

这等效于Xcalibur37的答案,尽管按照我的判断方式,由于WPF迫使您同时拥有.cs文件和.xaml文件,因此您最好放置不太可能.cs文件中进行更改。