当主窗口处于非活动状态时,如何在主窗口上显示showdialog?

时间:2015-05-28 07:19:01

标签: wpf windows

我正在使用WPF开发一个应用程序。

就我而言,用户有2台显示器。当他在辅助屏幕中打开应用程序时,它将加载数据近5秒钟。在此期间,他可能会转向个人主要屏幕,如访问Facebook或访问推特。

加载数据后,应提示对话框。困扰我的是它经常在主屏幕上显示他处理个人资料,而不是他打开应用程序的辅助屏幕。对话框窗口应该显示在应用程序的顶部。

我在想它是因为加载数据时应用程序不活动。你们有什么想法吗?

我知道MessageBox.Show()有一个"所有者"参数可以修复此问题。如何自动获得正确的所有者?我正在使用PRISM模式,因此我不容易找到窗口作为所有者。

代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        await Task.Delay(5000);
        MessageBox.Show("Loaded!");
    }
}

2 个答案:

答案 0 :(得分:0)

是的,所有者参数应该解决这个问题。关于棱镜,有不同的方法。对我来说最简单的方法是使用引用应用程序主窗口的Application.Current.MainWindow

MessageBox.Show(Application.Current.MainWindow, "bla bla");

您也可以尝试通过IoC容器解析Shell窗口,并将其作为所有者。

答案 1 :(得分:0)

您可以尝试使用Extended WPF Toolkit Community Edition(NuGet Package Extended.Wpf.Toolkit)中的MessageBox

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <xctk:WindowContainer>
            <xctk:ChildWindow Height="100" Width="250" Left="10" Top="10" Name="chWindow">
                <TextBlock Text="Hello World ..." />
            </xctk:ChildWindow>
            <xctk:MessageBox Height="100" Width="250" Left="10" Top="100" Name="msgBox">                
            </xctk:MessageBox>
        </xctk:WindowContainer>
        <Button Name="btnTst" Click="btnTst_Click" Content="Test" Width="65" Height="30" HorizontalAlignment="Left" VerticalAlignment="Bottom" />
    </Grid>
</Window>

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private async void btnTst_Click(object sender, RoutedEventArgs e)
    {
        await Task.Delay(5000);
        //this.chWindow.Show();
        this.msgBox.ShowMessageBox();
    }
}

MessageBox在Window ...