【问题标题】:How can I showdialog on the mainwindow when it is inactive?当它处于非活动状态时,如何在主窗口上显示对话框?
【发布时间】:2015-05-28 07:19:01
【问题描述】:

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

在我的例子中,用户有 2 台显示器。当他在副屏打开应用时,会加载将近 5 秒的数据。在此期间,他可能会转向主屏幕查看个人资料,例如访问 Facebook 或访问 Twitter。

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

我认为这是因为加载数据时应用程序未处于活动状态。你们有什么想法吗?

我知道 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!");
    }
}

【问题讨论】:

  • 如何显示对话框。贴出代码。顺便说一句,您可以显示启动画面或一些进度指示器而不是消息框。
  • 这可能会回答您的问题:stackoverflow.com/a/679868/2899478
  • 这是一个想法。发布一些关于如何打开对话框的代码
  • 代码已发布。谢谢你提醒我。

标签: wpf windows


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。对于这种特定情况,它可以工作。但我正在寻找一种显示消息框的通用方法。在 Prism 中,主窗口通常是 Shell。如果存在主窗口以外的弹出窗口,并且我希望在该窗口上显示对话框,则不能使用 MainWindow 作为参数。
【解决方案2】:

您可以尝试使用 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 内...

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多