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

Wpf 当主窗口处于非活动状态时,如何在主窗口上显示对话框?,wpf,windows,Wpf,Windows,我正在用WPF开发一个应用程序 在我的例子中,用户有两个监视器。当他在辅助屏幕上打开应用程序时,它将加载数据将近5秒钟。在此期间,他可能会转向主屏幕查看个人信息,如访问Facebook或twitter 加载数据后,应提示一个对话框。让我烦恼的是,它经常出现在他处理个人事务的主屏幕上,而不是他打开应用程序的次屏幕上。对话框窗口应该显示在应用程序的顶部 我认为这是因为加载数据时应用程序未处于活动状态。你们知道吗 我知道MessageBox.Show()有一个“owner”参数可以解决这个问题。如何自

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

在我的例子中,用户有两个监视器。当他在辅助屏幕上打开应用程序时,它将加载数据将近5秒钟。在此期间,他可能会转向主屏幕查看个人信息,如访问Facebook或twitter

加载数据后,应提示一个对话框。让我烦恼的是,它经常出现在他处理个人事务的主屏幕上,而不是他打开应用程序的次屏幕上。对话框窗口应该显示在应用程序的顶部

我认为这是因为加载数据时应用程序未处于活动状态。你们知道吗

我知道MessageBox.Show()有一个“owner”参数可以解决这个问题。如何自动获得正确的所有者?我使用的是棱镜模式,所以我不容易找到作为所有者的窗口

代码:


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

MessageBox.Show(Application.Current.MainWindow, "bla bla");
您还可以尝试通过IoC容器解析Shell窗口,并将其作为所有者。

您可以尝试使用Extended WPF Toolkit Community Edition(NuGet Package Extended.WPF.Toolkit):


MessageBox位于窗口内…

如何显示对话框。张贴代码。顺便说一句,你可以显示启动屏幕或一些进度指示器,而不是messagebox。这可能会回答你的问题:这里有一个想法。发布一些代码,说明如何打开对话框。这些代码是如何发布的。谢谢你提醒我,谢谢。对于这种特殊情况,它可以工作。但是我正在寻找一种显示messagebox的通用方法。在Prism中,主窗口通常是外壳。如果存在除主窗口之外的弹出窗口,并且我希望对话框显示在该窗口上,我不能使用主窗口作为参数。
MessageBox.Show(Application.Current.MainWindow, "bla bla");
<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();
    }
}