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属性,从而达到修改文本颜色的效果。