Win8中使用MessageBox

Posted by baicai on July 4, 2013

在Win8商店应用中是没有MessageBox的,弹出对话框可以用下面的方式实现:

private async void CancelCommandButton_Click(object sender, RoutedEventArgs e)
{
    // Create the message dialog and set its content
    var messageDialog = new MessageDialog("No internet connection has been found.");

    // Add commands and set their callbacks; both buttons use the same callback function instead of inline event handlers
    messageDialog.Commands.Add(new UICommand(
        "Try again", 
        new UICommandInvokedHandler(this.CommandInvokedHandler)));
    messageDialog.Commands.Add(new UICommand(
        "Close", 
        new UICommandInvokedHandler(this.CommandInvokedHandler)));

    // Set the command that will be invoked by default
    messageDialog.DefaultCommandIndex = 0;

    // Set the command to be invoked when escape is pressed
    messageDialog.CancelCommandIndex = 1;

    // Show the message dialog
    await messageDialog.ShowAsync();
}

private void CommandInvokedHandler(IUICommand command)
{
    // Display message showing the label of the command that was invoked
    rootPage.NotifyUser("The '" + command.Label + "' command has been selected.", 
        NotifyType.StatusMessage);
}

当然了可以简单的封装成MessageBox:

public async static void Show(string str)
        {
            var messageDialog = new MessageDialog(str);
            await messageDialog.ShowAsync();
        }

以往的开发中我们常常会弹出一个模态对话框来等待用户的响应,silverlight中是使用MessageBox,但在Metro       
UI中提供了一个全新的对话框MessageDialog,它是以异步方式弹出,你当然可以使用await来等待用户的响应,它还有一个更炫耀的功能就是可以在一个对话框让指定多个命令!你在以往往的开发中如果想实现类似的功能,是不是得自己实现?MessageDialog只提供了一个弹出方法:

public       IAsyncOperation<IUICommand>       ShowAsync();

(1)只有提示消息对话框

使用一个构造函数的MessageDialog可以实例化一个对话框,然后以异步方式打开它,此时它会默认显示一个“关闭”按钮:

          MessageDialog       md = new MessageDialog(保存成功,请注意查收。</span>);md.ShowAsync();

效果图:



(2)带有标题的对话框<br />
            MessageDialog       md = new MessageDialog(保存成功,请注意查收。</span>, 提示);

效果图:



(3)指定自定义命令的对话框

MessageDialog类有一个重要的成员,可以在当前对话框中呈现多个命令按钮:<br />
public IList<IUICommand>       Commands { get; }         

可以看到,只要你愿意,你可以向Commands注入多个命令,有意思吧?有一个已经实现了接口IUICommand的类UICommand,这个类就是对命令的处理,它不仅接收一个标签文本,还可以接收一个处理程序的委托UICommandInvokedHandler,UICommand类的构造函数有四个:<br />
        public       UICommand();public       UICommand(string       label);public       UICommand(string       label, UICommandInvokedHandler action);public       UICommand(string label,       UICommandInvokedHandler action, object       commandId);

来看一下如何注册命令的处理程序:<br />


       MessageDialog md = new       MessageDialog(确定要提交当前数据吗?</span>, 询问);md.Commands.Add(new       UICommand(确定, cmd =>{Debug.WriteLine(确定);}));md.Commands.Add(new       UICommand(放弃, cmd =>{Debug.WriteLine(放弃);}));md.ShowAsync();



效果图:



如果你觉得上面的处理还不过瘾,请看下面。<br />
(4)使用具有命令Id的命令<br />
细心的你一定能发现上面UICommand的最后一个构造函数:

public UICommand(string       label, UICommandInvokedHandler action, object       commandId);

最后一个参数可以指定命令的Id,也就是说,在下文中我们可以根据这个Id来进行不同的操作,这个object类型的Id允许你给它任意类型的数据。下面的代码我们取消了注册命令处理程序,而是为指定了命令Id:<br />


                        MessageDialog       md = new MessageDialog(确定要提交当前数据吗?</span>, 询问);md.Commands.Add(new       UICommand(确定, null,        0));md.Commands.Add(new UICommand(放弃,        null, 1));md.Commands.Add(new       UICommand(帮组, null,        2));md.DefaultCommandIndex        = 0;md.CancelCommandIndex        = 1;var flg = await md.ShowAsync();//var flg = md.ShowAsync();switch       (flg.Id){case 0://Do       Somethingbreak;case 1://Do       Somethingbreak;case 2://Go       to Helpbreak;default:break;}





在前面我们看到MessageDialog是以异步方式打开,所以我们可以根据需要获取ShowAsync()的响应结果,根据命令Id执行进一步的操作。使用DefaultCommandIndex指定当我们按下Enter键时响应的按钮,CancelCommandIndex指定当按下Esc键时应的按钮。<img width=”894” height=”154” alt=”” src=”http://pic002.cnblogs.com/images/2012/48455/2012091710565216.png” />

很遗憾的是MessageDialoge不能定义对话框的样式,&nbsp;      如何想创建更个性的对话框,可以使用Popup
来模拟对话框,关于Popup这里就不再介绍了,感兴趣的可以去查找相关资料。