c# - 如何获取执行上下文菜单的控件名称

标签 c# windows-phone-7 contextmenu

我有几个文本 block 用作图 block 。我想要做的是点击并按住任何文本 block 并获取上下文菜单。我已经完成了,而且效果很好。我被卡住的地方是当我点击上下文菜单中的菜单项时,我想知道在哪个文本 block 上点击了菜单项。我怎样才能做到这一点?

我已经尝试过类似的方法,但没有成功:

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);
    }

这是 contextmenu 和 tetblocks 所在的 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);

这远非理想,但只要您没有太多想要将上下文菜单附加到它的项目,它就不会太糟糕,尽管如果有人有更好的解决方案,我也想知道。

关于c# - 如何获取执行上下文菜单的控件名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6723877/

相关文章:

c# - RavenDb 从不同来源导入数据,如 xml、cvs

windows-phone-7 - 如何在 WP7 中隐藏软键盘?

javascript - 在 HTML 标签上动态插入 angularJS contextMenu

java - 我们如何为树查看器动态生成子菜单上下文

javascript - 仅当右键单击以 "Story"开头的类时才显示上下文菜单按钮

c# - iTextSharp PDF 打印

c# - 如何向 NET Core 2.0 的 SignalR alpha 上的所有客户端发送消息

c# - 在 .Net Core Web API 中使用 web.config 文件

c# - 如何在 Windows Phone 7 上将 JSON 解析为动态对象?

c# - 如何将字符串列表数据绑定(bind)到 WPF/WP7 中的 ListBox?