开发者

ContextMenu disappears immediately after appearing

I have a context menu but it is disappearing instantly after it shows up.

<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;
            }
        }


It's likely because you're not marking the MouseDown event to handled. Set e.Handled to true and it will no longer propagate and your ContextMenu will stay open.

That said, this is an awful way to assign a ContextMenu in the first place. Why not just do this:

<TextBlock ...>
    <TextBlock.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Zoom to Incident" Click="thisMenuItem_Click"/>
        </ContextMenu>
    </TextBlock.ContextMenu>
</TextBlock>


You should assign your menu to the ContextMenu property of your TextBlock so that the opening and positioning will be taken care of for you. You also don't need to create the menu in each MouseDown; just create it once and assign it to the ContextMenu property.

In XAML:

<TextBlock 
    Name="InputtedAddress" 
    Text="{Binding Path=InputtedAddress}"  
    >
    <TextBlock.ContextMenu>
        <ContextMenu> 
             <MenuItem
                 Header="Zoom to Incident"
                 Click="ContextMenu_Click"
             />
         </ContextMenu>
    </TextBlock.ContextMenu>
</TextBlock>

If you do want to show it manually you will need to position it before showing it by setting the PlacementTarget property, something like this:

private void InputtedAddress_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.RightButton == MouseButtonState.Pressed)
    {
        thisMenuPlacementTarget = InputtedAddress;
        thisMenu.IsOpen = true;
    }
}

P.S. "Inputted" is not a word :)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜