如何获取在其上执行上下文菜单的控件项的名称
本文关键字:菜单 上下文 控件 执行 何获取 获取 | 更新日期: 2023-09-27 18:02:36
我有几个文本块作为磁贴。我想做的是点按并按住任何textblock然后得到一个contextmenu。我已经这样做了,而且效果很好。当我点击上下文菜单中的菜单项时,我卡住了,我想知道菜单项被点击在哪个文本块上。我怎样才能做到呢?
我已经尝试过这样的事情,但没有运气:
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
MenuItem menuItem = (MenuItem)sender;
var sndr = menuItem.ItemContainerGenerator.ContainerFromItem((sender as ContextMenu).DataContext).ToString();
// var sndr = menuItem.DataContext.ToString();
MessageBox.Show("you tapped at " + sndr);
}
这是上下文菜单和文本块所在的xaml代码:
<ScrollViewer>
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu Name="holdOptions">
<toolkit:MenuItem Header="New" Click="MenuItem_Click" />
<toolkit:MenuItem Header="Delete" Click="MenuItem_Click"/>
<toolkit:MenuItem Header="Clear" Click="MenuItem_Click"/>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="208" />
<ColumnDefinition Width="5" />
<ColumnDefinition Width="208" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="210"/>
<RowDefinition Height="5" />
<RowDefinition Height="210" />
<RowDefinition Height="5" />
<RowDefinition Height="210" />
</Grid.RowDefinitions>
<StackPanel Grid.Column="0" Grid.Row="0" Background="{StaticResource PhoneAccentBrush}" Height="205" Width="205">
<TextBlock Height="205" Width="205" Name="con1" Text="Tap to add" Tap="con1_Tap" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Center" TextAlignment="Center" FontSize="28" Hold="con1_Hold" />
</StackPanel>
<StackPanel Grid.Column="2" Grid.Row="0" Background="{StaticResource PhoneAccentBrush}" Height="205" Width="205">
<TextBlock Height="205" Width="205" Name="con2" Text="Tap to add" Tap="con2_Tap" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Center" TextAlignment="Center" FontSize="28" Hold="con2_Hold" />
</StackPanel>
<StackPanel Grid.Column="0" Grid.Row="2" Background="{StaticResource PhoneAccentBrush}" Height="205" Width="205">
<TextBlock Height="205" Width="205" Name="con3" Text="Tap to add" Tap="con3_Tap" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Center" TextAlignment="Center" FontSize="28" Hold="con3_Hold" />
</StackPanel>
<StackPanel Grid.Column="2" Grid.Row="2" Background="{StaticResource PhoneAccentBrush}" Height="205" Width="205">
<TextBlock Height="205" Width="205" Name="con4" Text="Tap to add" Tap="con4_Tap" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Center" TextAlignment="Center" FontSize="28" Hold="con4_Hold" />
</StackPanel>
</Grid>
</ScrollViewer>
我发现唯一的解决方案是为每个TextBlock附加一个单独的上下文菜单。
<StackPanel Grid.Column="0" Grid.Row="0" Background="{StaticResource PhoneAccentBrush}" Height="205" Width="205">
<TextBlock Height="205" Width="205" Name="con1" Text="Tap to add" Tap="con1_Tap" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Center" TextAlignment="Center" FontSize="28" Hold="con1_Hold"/>
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu Name="holdOptions">
<toolkit:MenuItem Header="New" Click="MenuItem_Click" />
<toolkit:MenuItem Header="Delete" Click="MenuItem_Click"/>
<toolkit:MenuItem Header="Clear" Click="MenuItem_Click"/>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
</TextBlock>
</StackPanel>
<StackPanel Grid.Column="2" Grid.Row="0" Background="{StaticResource PhoneAccentBrush}" Height="205" Width="205">
<TextBlock Height="205" Width="205" Name="con2" Text="Tap to add" Tap="con2_Tap" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Center" TextAlignment="Center" FontSize="28" Hold="con2_Hold" >
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu Name="holdOptions">
<toolkit:MenuItem Header="New" Click="MenuItem_Click" />
<toolkit:MenuItem Header="Delete" Click="MenuItem_Click"/>
<toolkit:MenuItem Header="Clear" Click="MenuItem_Click"/>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
</TextBlock>
</StackPanel>
那么你可以直接使用
var menuItem = ((MenuItem)sender);
这远不是理想的,但只要你没有太多的项目,你想附加上下文菜单,它不是太坏,虽然如果有人有一个更好的解决方案,我想知道它。