日期:2014-05-17  浏览次数:20599 次

新时尚Windows8开发(5):消息框

在Windows 8 Modern界面应用程序中 ,已然没有了我们过去很熟悉的MessageBox,那么,如果我们需要弹出提示框怎么办呢?

因此,我们先来认识一个类——MessageDialog(位于Windows.UI.Popups命名空间)。对的,看名字估计也能猜个七八成了,我们正是要使用该类来显示弹出对话框。

第一步,先new一个MessageDialog实例;

第二步,向Commands集合添加若干个UICommand,至少一个,最多三个,胆子大的话,你可以试试添加四个。这个UICommand就是对话框上显示的按钮,就像我们过去在传统Windows下的消息框一样,至少一个按钮,也可能两个,或者三个。

第四步,显示消息框。

 

光看文字是有些抽象的,这样吧,下面我们来用实例来说明。

1、启动VS,新建一个空白页面的应用程序。

2、在MainPage.xaml中声明三个按钮,分别用来显示带有一个,两个,三个按钮的弹出框。

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <StackPanel VerticalAlignment="Center">
            <StackPanel Orientation="Horizontal">
                <Button Content="一个按钮的消息框" Click="onOKClick"/>
                <Button Content="两个按钮的消息框" Click="onYesNoClick"/>
                <Button Content="三个按钮的消息框" Click="onThirdClick"/>
            </StackPanel>
            <TextBlock x:Name="tbTip" Margin="3,6,0,0" FontSize="24"/>
        </StackPanel>
    </Grid>


 

3、分别在三个按钮的Click事件上右击,从弹出的菜单中选择“定位到事件处理程序”,这样在代码中会自动生成事件处理方法。

4、打开代码文件,引入以下命名空间。

using Windows.UI.Popups;

5、处理上面三个Click事件。

        private async void onOKClick(object sender, RoutedEventArgs e)
        {
            MessageDialog msg = new MessageDialog("只带一个按钮的消息框。", "提示");
            msg.Commands.Add(new UICommand("确定", new UICommandInvokedHandler(OnUICommand)));
            await msg.ShowAsync();
        }

        private async void onYesNoClick(object sender, RoutedEventArgs e)
        {
            MessageDialog msg = new MessageDialog("带两个按钮的消息框。");
            msg.Commands.Add(new UICommand("是",new UICommandInvokedHandler(OnUICommand)));
            msg.Commands.Add(new UICommand("否", new UICommandInvokedHandler(OnUICommand)));
            await msg.ShowAsync();
        }

        private async void onThirdClick(object sender, RoutedEventArgs e)
        {
            MessageDialog msg = new MessageDialog("带三个按钮的消息框。");
            msg.Commands.Add(new UICommand("重试", new UICommandInvokedHandler(OnUICommand)));
            msg.Commands.Add(new UICommand("忽略", new UICommandInvokedHandler(OnUICommand)));
            msg.Commands.Add(new UICommand("取消", new UICommandInvokedHandler(OnUICommand)));
            // 默认按钮索引
            msg.CancelCommandIndex = 2;
            msg.DefaultCommandIndex = 0;
            await msg.ShowAsync();
        }

        async void OnUICommand(IUICommand cmd)
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
                () =>
                {
                    this.tbTip.Text = "您点击了 " + cmd.Label + " 按钮。";
                });
        }


 

在实例化UICommand时,我们使用了以下构造函数。

public UICommand(string label, UICommandInvokedHandler action);

指定一个与UICommandInvokedHandler委托绑定的方法,这样,当某个UICommand被用户单击后,会调用UICommandInvokedHandler绑定的对应方法,在本例中,所有UICommand都绑定到同一个方法。

 

此外,MessageDialog有两个属性应当注意一下:

1、CancelCommandIndex:默认“取消”按钮的索引,这个索引是对应于Commands中添加的UICommand的索引,从0开始,按添加顺序,第一个UICommand的索引为0,第二个UICommand的索引为1,第三个为2,依此类推(当然,最多就只有三个,索引2)。假如CancelCommandIndex属性设置了1,那么,消息框中的第二个按钮就是默认的“取消”命令,只要按下ESC键就能触发。

2、DefaultCommandIndex:默认“确定”指令的索引,例如设置为0,即Commands中第一个按钮为默认命令,只要按下回车键就能触发。

 

要显示MessageDialog,调用ShowAsync方法,注意这个方法是异步方法,要用await关键字(C# 5.0),同时,凡是调用了异步方法并加有await关键字的方法,在定义时还要加上async关键字。

现在,我们可以运行应用程序。