ContextMenu在出现后立即消失

时间:2011-06-13 16:15:22

标签: c# wpf xaml 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;
            }
        }

2 个答案:

答案 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。 “输入”不是一个词:)