这是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>
编辑和清除项目的方法都需要知道要对哪个标签进行操作。我怎么能这样做?
答案 0 :(得分:4)
我认为您正在寻找PlacementTarget
:
http://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等。如果有效,请告诉我们。