Как получить имя элемента управления, по которому выполнялось контекстное меню - PullRequest
2 голосов
/ 17 июля 2011

У меня есть несколько текстовых блоков, функционирующих как плитки.Что я хочу сделать, это нажать и удерживать любой из текстовых блоков и получить контекстное меню.Это я сделал, и это прекрасно работает.Я застреваю, когда я нажимаю на элемент меню внутри контекстного меню, и я хочу знать, в каком текстовом блоке был выбран элемент меню.Как мне этого добиться?

Я уже пробовал что-то подобное, но без удачи:

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, в котором находятся contextmenu и tetblocks:

 <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>

1 Ответ

0 голосов
/ 18 июля 2011

Единственное решение, которое я нашел, это работает, это прикрепить отдельное контекстное меню к каждому 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);

Это далеко от идеала, но до тех пор, пока у вас не слишком много пунктов, к которым вы хотите присоединить контекстное меню, это не так уж плохо, хотя, если у кого-то есть лучшее решение, я бы тоже хотел это знать.

...