如何从App.xaml.cs运行MessageBox.Show()函数

4
我可以在App.xaml.cs中运行MessageBox.Show(),这样它会显示在当前页面上。请提供一些解决方案的代码或其他方案。我需要显示一些与整个应用程序相关的系统消息。

MessageBox.Show()总是显示在当前页面的顶部。能否请您更详细地解释一下您的要求? - Derek Lakin
这是正确的,当你从当前页面运行它时,但我需要通过 App.xaml.cs 类中的某个事件来运行它。 - infoexpert.it
5个回答

7
我不确定,但这个方法行不行?
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
 MessageBox.Show("");
}
);

你可以使用 App.xaml.cs 中可用的导航数据来确定当前页面并在该页面上执行操作。
我想无论你想到什么,应用程序都需要处于稳定状态,当处理(未处理)异常时可能无法做到这一点。您应该告诉我们更多信息,以便我们了解您为什么要这样做。如果您必须从 App.xaml.cs 调用 MessageBox.Show,则似乎您的设置有些问题。

这对我有用,谢谢。当应用程序接收到原始推送通知时,我需要通知用户。用户可以在应用程序的任何地方。如果用户不喜欢此功能,可以在设置中禁用它。 - infoexpert.it
2
有不同的方法来处理这个问题。我首先想到的是创建一个事件,当通知到达时触发该事件,使得页面可以订阅此事件。这样你可以从实际页面中处理它,而不是从App.xaml.cs中处理。你可以创建一个继承自Page的基类,并将其用于你所有的页面,以实现一个处理事件的公共方法。希望这有些意义。你应该尽量保持App.xaml的干净整洁。 - invalidusername

4
一个简单的方法是...
  public partial class App : Application
  {
    public static void ShowBox(string msg)
    {
      MessageBox.Show(msg);
    }
  }

然后从窗口或应用程序的任何其他部分...

  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();
      App.ShowBox("Hello!");
      ...

'ShowBox'方法是静态的,因此您可以从任何地方调用它。当然,毫无疑问,这并不是最干净或最健壮的方法,但它可行。


谢谢,但我的事件来自App类,MessageBox.Show(msg)应该显示在任何页面的顶部。 - infoexpert.it
据我所知,消息框将始终处于最顶层,因此会显示在任何页面的顶部。 - A.R.
是的,现在我的问题是,我如何从App类运行它,而不是从任何其他页面运行。谢谢。 - infoexpert.it

1

我从你的问题中理解到,你正在寻找一种方法,在应用程序的其他地方触发某些事件时,从App.xaml.cs中显示消息。

你可以使用观察者模式实现,让App.xaml.cs注册一个由你的自定义页面触发的事件。

话虽如此,从长远来看,我建议你使用消息框架来实现这个目的。大多数MVVM框架都带有消息框架。它们易于使用,没有或很少的学习曲线。

  1. MVVM Light
  2. Simple MVVM
  3. MS patterns & practices的PRISM(适用于较大的应用程序)。这不仅是一个MVVM框架。
  4. Ultra light MVVM

还有许多类似的框架。


谢谢,我需要从App.xaml.cs触发。 - infoexpert.it

1

我使用了这个链接中的代码片段 http://www.c-sharpcorner.com/UploadFile/c25b6d/message-dialog-in-windows-store-apps/

private async void Delete_Click(object sender, RoutedEventArgs e)
    {
        var messageDialog = new Windows.UI.Popups.MessageDialog("Are you sure you want to permanently delete this record?");

        messageDialog.Commands.Add(new UICommand("Yes", (command) =>
        {
            //Do delete
        }));
        messageDialog.Commands.Add(new UICommand("No", (command) =>
        {
            //Do Nothing
        }));
        //default command
        messageDialog.DefaultCommandIndex = 1;
        await messageDialog.ShowAsync();
    }

0

在尝试其他解决方案无果后,找到了:

CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync

在Windows Phone 8.1上,可以从App.xaml.cs调用MessageDialog到UI线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接