我有一个由6个不同标签共享的上下文菜单,如何判断哪个标签正在使用上下文菜单的当前实例?

时间:2010-02-11 22:28:49

标签: c# wpf c#-4.0 label contextmenu

这是contextMenu的xaml:

    <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 个答案:

答案 0 :(得分:4)

我认为您正在寻找PlacementTargethttp://msdn.microsoft.com/en-us/library/system.windows.controls.contextmenu.placementtarget.aspx

如果切换到Command模式,您实际上可以通过Binding获取它并将其作为CommandParameter传递...

答案 1 :(得分:1)

这是我想出的答案。我真的不喜欢它,因为它有点黑客,但它确实有效。您的想法是让标签听取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;
}

答案 2 :(得分:0)

例如,尝试将DataContext设置为标签

在Click事件中,只需检查((FrameworkElement)发件人).DataContext for FIRST / SECOND等。如果有效,请告诉我们。