由.ShowDialog调用的模态最顶层WPF窗口显示在后台

时间:2016-09-12 12:25:23

标签: c# wpf

我有一个WPF应用程序,我想用密码保护我的中央tabcontrol中的tabitem。

所以我在MainWindow.xaml.cs中使用了tabControl_SelectionChanged事件,如果所选的tabitem有一个tag =“password”,我会调用一个模态密码对话框。

private void tabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        TabItem selectedItem = (TabItem)e.AddedItems[0];

        if (selectedItem.Tag != null && selectedItem.Tag.Equals("Password"))
        {
            PasswordView pw = new PasswordView();
            pw.Owner = this;
            bool? result = pw.ShowDialog();

            if (result.HasValue && !result.Value)
            {
                tabControl.SelectedItem = tabControl.Items[0];
            }
        }
    }

这里是密码对话框的属性:

Topmost="True"  
Title="PasswordView"      
WindowStyle="None" 
ResizeMode="NoResize" 
WindowState="Maximized"
WindowStartupLocation="CenterScreen" 
ShowInTaskbar="False"

MainWindow的属性:

WindowState="Maximized" 
WindowStyle="None" 
ResizeMode="NoResize" 

视图显示文本框和按钮。在按钮单击时,我正在检查viewmodel中的密码并将MVVMLight消息发送到密码视图,因此视图可以设置DialogResult并自行关闭它。 (我也用DialogCloser和DialogResult数据绑定完成了,我得到了相同的结果)

在viewmodel中:

if (password.Equals(Properties.Settings.Default.ServicePassword))
        {
            PasswordOk = true;
        }
        else
        {
            PasswordOk = false;
        }

        password = "";

        Messenger.Default.Send<NotificationMessage>(
            new NotificationMessage(this, "CloseWindowsBoundToMe")
        );

和视图:

Messenger.Default.Register<NotificationMessage>(this, (nm) => CloseWindow(nm));


    private void CloseWindow(NotificationMessage nm)
    {
        if (nm.Notification == "CloseWindowsBoundToMe")
        {
            if (nm.Sender == this.DataContext)
            {
                PasswordViewModel pvm = ((PasswordViewModel)DataContext);
                DialogResult = pvm.PasswordOk;
            }
        }
    }

回到MainWindow.xaml.cs我正在检查DialogResult。如果为true(密码正常)则不执行任何操作,如果为false,则将tabcontrol的SelectedItem设置为主选项卡。

TabItem selectedItem = (TabItem)e.AddedItems[0];

        if (selectedItem.Tag != null && selectedItem.Tag.Equals("Password"))
        {
            PasswordView pw = new PasswordView();
            pw.Owner = this;
            bool? result = pw.ShowDialog();

            if (result.HasValue && !result.Value)
            {
                tabControl.SelectedItem = tabControl.Items[0];
            }
        }

基本上一切正常,但是如果我想在保护的tabitem中更改3次以上输入错误的密码,则模态密码视图不会显示在前台。只有Alt + Tab将对话框带到前台....

该结果是可再现的 - &gt;尝试3次是好的,然后下一次尝试密码对话框显示在后台。

还有另一个受密码保护的标签,如果我在密码对话框卡在后台后点击此标签,则会显示两个密码对话框...

所以问题是:为什么模态密码对话框不能正常工作?

0 个答案:

没有答案