最近写的程序想模拟win8中的右键单击某个磁贴就会弹出一个appbar来当作菜单设置的功能,就是类似如下的效果:
查了好久没弄好,最终让我试出来了,只需要更改一下属性即可。
以下是我的appbar的初始xaml代码:
<Page.BottomAppBar>
<AppBar Background="#FF00B7EF" BorderBrush="#FF00B7EF" Name="myAppBar">
<AppBar.Content>
<Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<Button Visibility="Collapsed" Name="remove" AutomationProperties.Name="删除该项目" Style="{StaticResource RemoveAppBarButtonStyle}" Click="remove_Click"/>
<Button Visibility="Collapsed" Name="removeAll" AutomationProperties.Name="删除所有项目" Style="{StaticResource RemoveAppBarButtonStyle}" Click="removeAll_Click"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<Button Name="about" AutomationProperties.Name="关于" Style="{StaticResource HomeAppBarButtonStyle}" Click="about_Click"></Button>
<Button Name="setting" AutomationProperties.Name="设置" Style="{StaticResource SettingsAppBarButtonStyle}" Click="setting_Click"></Button>
<Button Name="export" AutomationProperties.Name="导出为文本文件" Style="{StaticResource DownloadAppBarButtonStyle}" Click="export_Click"></Button>
</StackPanel>
</Grid>
</AppBar.Content>
</AppBar>
</Page.BottomAppBar>
代码中包含五个按钮,其中有两个是暂时不可见的,我要实现的功能是当右键单击(触发selectionchanged事件)某个Grid的某个item的时候,马上弹出appbar,进行相应的操作。
当触发selectionchanged事件的时候,如果选中了一个那么
indexNum = IndexView.SelectedIndex;
就会得到一个索引值,如果取消选中就会得到-1,所以在得到非-1值的时候,让remove和removeAll两个按钮可见,并让整个appbar可见(isOpen=true);在-1的时候,让其不可见,综上,只要加入这么几行代码:
if (indexNum != -1)
{
remove.Visibility = Windows.UI.Xaml.Visibility.Visible;
removeAll.Visibility = Windows.UI.Xaml.Visibility.Visible;
myAppBar.IsOpen = true;
}
else {
remove.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
removeAll.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
}
相关c#代码如下:
int indexNum = 0;
private void remove_Click(object sender, RoutedEventArgs e)
{
myIndex.RemoveAt(indexNum);
remove.Visibility = Windows.UI.Xaml.Visibility.Visible;
removeAll.Visibility = Windows.UI.Xaml.Visibility.Visible;
}
private void select(object sender, SelectionChangedEventArgs e)
{
indexNum = IndexView.SelectedIndex;
if (indexNum != -1)
{
remove.Visibility = Windows.UI.Xaml.Visibility.Visible;
removeAll.Visibility = Windows.UI.Xaml.Visibility.Visible;
myAppBar.IsOpen = true;
}
else {
remove.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
removeAll.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
}
}
private async void removeAll_Click(object sender, RoutedEventArgs e)
{
MessageDialog md = new MessageDialog("确定删除所有日记?");
md.Commands.Add(new UICommand("确定", command =>
{
myIndex.Clear();
}));
md.Commands.Add(new UICommand("取消", command =>
{
//do nothing
}));
await md.ShowAsync();
}
最终效果:
在未选中之前:
选中Grid中的item之后: