У меня есть контекстное меню, которое используется 6 различными метками. Как узнать, какая метка использует текущий экземпляр контекстного меню? - PullRequest
3 голосов
/ 12 февраля 2010

Вот xaml для contextMenu:

    <Window.Resources>
    <ContextMenu x:Key="IBContextMenu" x:Shared="true" Name="IBContextMenu1">
        <MenuItem Header="Edit" Click="ibEdit_Click" AllowDrop="False" />
        <MenuItem Header="Clear" Click="ibClear_Click"/>
    </ContextMenu>
</Window.Resources>

Методы редактирования и очистки элементов должны знать, на какую метку действовать Как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 16 февраля 2010

Я думаю, что вы ищете PlacementTarget: http://msdn.microsoft.com/en-us/library/system.windows.controls.contextmenu.placementtarget.aspx

Если вы переключитесь на шаблон Command, вы можете получить его через Binding и передать как CommandParameter ...

1 голос
/ 15 февраля 2010

Вот ответ, который я придумал. Мне это не очень нравится, потому что это немного хакерство, но это работает. Идея состоит в том, что вы заставляете ваши метки слушать событие MouseRightButtonUp, которое запускается, когда пользователь отпускает правую кнопку мыши после нажатия, чтобы открыть контекстное меню. В обработчике событий вы устанавливаете частную переменную Label для метки, которую пользователь только что щелкнул правой кнопкой мыши. Затем в вашем обработчике кликов MenuItem вы можете получить доступ к этой закрытой переменной Label. Обратите внимание, что все метки, которые вы хотите сделать, должны использовать тот же обработчик для MouseRightButtonUp.

Например:

<Window.Resources>
    <ContextMenu x:Key="MyMenu">
        <MenuItem Header="Edit" Click="Edit_Click"/>
        <MenuItem Header="Clear" Click="Clear_Click"/>
    </ContextMenu>
</Window.Resources>
<StackPanel>
    <Label ContextMenu="{StaticResource MyMenu}" 
           MouseRightButtonUp="Label_MouseRightButtonUp">Some text</Label>
    <Label ContextMenu="{StaticResource MyMenu}" 
           MouseRightButtonUp="Label_MouseRightButtonUp">Some junk</Label>
    <Label ContextMenu="{StaticResource MyMenu}" 
           MouseRightButtonUp="Label_MouseRightButtonUp">Some stuff</Label>
    <Label ContextMenu="{StaticResource MyMenu}"
           MouseRightButtonUp="Label_MouseRightButtonUp">Some 0000</Label>
</StackPanel>

Код:

private void Edit_Click(object sender, RoutedEventArgs e)
{
    if (clickedLabel != null)
    {
        MessageBox.Show(clickedLabel.Content.ToString());
    }
}

private void Clear_Click(object sender, RoutedEventArgs e)
{
    if (clickedLabel != null)
    {
        MessageBox.Show(clickedLabel.Content.ToString());
    }
}

private Label clickedLabel;
private void Label_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
    clickedLabel = (Label)sender;
}
0 голосов
/ 12 февраля 2010

Попробуйте установить DataContext для меток, например

А в событии Click просто проверьте отправителя ((FrameworkElement) .DataContext для FIRST / SECOND и т. Д. Сообщите нам, если это работает.

...