问题描述
|
我有一个上下文菜单,但是它显示后会立即消失。
<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;
}
}
附言\“输入\”不是单词:)
, 可能是因为您没有将要处理的“ 6”事件标记为要处理。将e.Handled
设置为true
,它将不再传播,并且ѭ3and将保持打开状态。
就是说,这是分配ContextMenu
的可怕方法。为什么不这样做:
<TextBlock ...>
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header=\"Zoom to Incident\" Click=\"thisMenuItem_Click\"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>