我有一个上下文菜单,但它出现后会立即消失。
<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;
}
}
答案 0 :(得分:2)
可能是因为您没有标记要处理的MouseDown
事件。将e.Handled
设置为true
,它将不再传播,您的ContextMenu
将保持打开状态。
尽管如此,这是一个很好的方式来首先分配一个ContextMenu
。为什么不这样做:
<TextBlock ...>
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="Zoom to Incident" Click="thisMenuItem_Click"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
答案 1 :(得分:0)
您应该将菜单分配到TextBlock
的{{3}}属性,以便为您开启和定位。您也不需要在每个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>
如果你想手动显示它,你需要在显示之前定位它,方法是设置ContextMenu属性,如下所示:
private void InputtedAddress_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.RightButton == MouseButtonState.Pressed)
{
thisMenuPlacementTarget = InputtedAddress;
thisMenu.IsOpen = true;
}
}
P.S。 “输入”不是一个词:)