PopupMenu

PopupMenu类公开Commands属性,类型为UICommand对象列表,每个UICommand对象表示一个菜单项。相信读者对UICommand类不会陌生,MessageDialog类也是使用UICommand类定义命令项。UICommand在对话框中呈现为按钮,而在菜单项中呈现为菜单项。

弹出上下文菜单有两种方式:

  • 调用ShowAsync方法:显示上下文菜单,方法参数指定显示菜单的坐标点。位置坐标的参考对象为当前窗口,在手机上可以以当前屏幕为参照(应用程序占满整个屏幕)
  • 调用ShowForSelectionAsync方法:菜单弹出的位置将以某个矩形区域为基础,菜单会根据当前屏幕的可用空间自动调整其出现的位置,但总体上不会偏离指定的矩形区域。

下面示例实现通过上下文菜单来改变文本颜色的功能。主页面的XAML代码如下:

        <TextBlock FontSize="150" Text="Test" VerticalAlignment="Center" HorizontalAlignment="Center" Tapped="TextBlock_Tapped"/>

处理TextBlock的Tapped事件,当用户单击该TextBlock后,弹出上下文菜单,然后通过菜单命令修改TextBlock文本的颜色。代码如下:

        private async void TextBlock_Tapped(object sender, TappedRoutedEventArgs e)
        {
            var tb = sender as TextBlock;
            var menu = new Windows.UI.Popups.PopupMenu();
            //用于响应菜单命令的回调
            UICommandInvokedHandler invokeHandler = (cmd) =>
            {
                var brush = cmd.Id as SolidColorBrush;
                tb.Foreground = brush;
            };
            //添加菜单项
            UICommand cmdRed = new UICommand("红",invokeHandler,new SolidColorBrush(Colors.Red));
            UICommand cmdYellow = new UICommand("黄",invokeHandler,new SolidColorBrush(Colors.Yellow));
            UICommand cmdBlue = new UICommand("蓝", invokeHandler, new SolidColorBrush(Colors.Blue));
            menu.Commands.Add(cmdRed);
            menu.Commands.Add(cmdYellow);
            menu.Commands.Add(cmdBlue);
            //计算TextBlock对象相对于当前窗口的位置坐标
            GeneralTransform gt = tb.TransformToVisual(null);
            Point popupPoint = gt.TransformPoint(new Point(0d,tb.ActualHeight));
            //显示菜单
            await menu.ShowAsync(popupPoint);
        }

UICommand对象使用共同的UICommandInvokedHandler实例去响应操作,并以指定颜色的SolidColorBrush对象(单色画刷)作为命令的ID,因为Id属性的类型为object,表明它可以赋任何类型的值。在委托处理代码中就可以直接通过cmd.Id属性取出对应的SolidColorBrush实例,并赋值给TextBlock对象的Foreground属性,从而达到修改文本颜色的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值