ContextMenu在出现后立即消失
我有一个上下文菜单,但它在出现后立即消失。ContextMenu在出现后立即消失
<TextBlock Name="InputtedAddress" Text="{Binding Path=InputtedAddress}" MouseDown="InputtedAddress_MouseDown"/>
System.Windows.Controls.ContextMenu thisMenu;
private void InputtedAddress_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.RightButton == MouseButtonState.Pressed)
{
thisMenu = new System.Windows.Controls.ContextMenu();
MenuItem thisMenuItem = new MenuItem() { Header = "Zoom to Incident" };
thisMenuItem.Click += new RoutedEventHandler(thisMenuItem_Click);
thisMenu.Items.Add(thisMenuItem);
thisMenu.IsOpen = true;
}
}
您应该分配您的菜单设置为您TextBlock
,使得开口和定位会照顾你的ContextMenu财产。您也不需要在每个MouseDown中创建菜单;只需创建一次并将其分配给ContextMenu
属性。
在XAML:
<TextBlock
Name="InputtedAddress"
Text="{Binding Path=InputtedAddress}"
>
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem
Header="Zoom to Incident"
Click="ContextMenu_Click"
/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
如果你想手动显示它您需要显示它通过设置PlacementTarget财产,这样的事情之前,它定位:
private void InputtedAddress_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.RightButton == MouseButtonState.Pressed)
{
thisMenuPlacementTarget = InputtedAddress;
thisMenu.IsOpen = true;
}
}
PS “输入”不是一个字:)
nope ..根本不起作用 – user1034912 2017-02-25 03:56:14
很可能是因为你没有标记要处理的MouseDown
事件。将e.Handled
设置为true
,它不会再传播,并且您的ContextMenu
将保持打开状态。
这就是说,这是一个可怕的方式来首先分配ContextMenu
。为什么不这样做:
<TextBlock ...>
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="Zoom to Incident" Click="thisMenuItem_Click"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
OP基于XAML处理MouseDown。 (即时)问题是上下文菜单未分配给任何控件,其位置从未设置。也就是说,它应该只在XAML中分配。 – 2011-06-13 16:26:13
@Ed:他没有将路由事件标记为已处理,因此它将继续冒泡视觉树。另一个控件将处理它,并且我假设这会导致ContextMenu被关闭。 – 2011-06-13 16:29:36
啊,好点。 – 2011-06-13 17:24:14
你为什么要创建和填充上下文菜单?为什么不把它分配给XAML? – 2011-06-13 16:21:47