Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ContextMenu出现后立即消失_C#_Wpf_Xaml_Contextmenu - Fatal编程技术网

C# ContextMenu出现后立即消失

C# ContextMenu出现后立即消失,c#,wpf,xaml,contextmenu,C#,Wpf,Xaml,Contextmenu,我有一个上下文菜单,但它出现后立即消失 System.Windows.Controls.ContextMenu此菜单; 私有void inputedAddress_MouseDown(对象发送方,MouseButtonEventArgs e) { 如果(e.RightButton==MouseButtonState.Pressed) { thisMenu=new System.Windows.Controls.ContextMenu(); MenuItem thisMenuItem=new

我有一个上下文菜单,但它出现后立即消失


System.Windows.Controls.ContextMenu此菜单;
私有void inputedAddress_MouseDown(对象发送方,MouseButtonEventArgs e)
{
如果(e.RightButton==MouseButtonState.Pressed)
{
thisMenu=new System.Windows.Controls.ContextMenu();
MenuItem thisMenuItem=new MenuItem(){Header=“缩放到事件”};
thisMenuItem.Click+=新建路由EventHandler(thisMenuItem\u Click);
thisMenu.Items.Add(thisMenuItem);
thisMenu.IsOpen=true;
}
}

您应该将菜单指定给
文本块的属性,以便为您打开和定位。您也不需要在每次鼠标按下时创建菜单;只需创建一次,并将其分配给
ContextMenu
属性

在XAML中:


如果要手动显示,则需要在显示前通过设置属性对其进行定位,如下所示:

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

注意,“Inputed”不是一个单词:)

这可能是因为您没有标记要处理的
MouseDown
事件。将
e.Handled
设置为
true
,它将不再传播,您的
上下文菜单将保持打开状态

这就是说,首先分配
ContextMenu
是一种糟糕的方式。为什么不这样做:

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


为什么要这样创建和填充上下文菜单?为什么不在XAML中分配它呢?基于XAML,OP正在处理MouseDown。(直接的)问题是上下文菜单未指定给任何控件,并且其位置从未设置。这就是说,它应该在这里的XAML中分配。@Ed:他没有将路由事件标记为已处理,因此它将继续在可视化树中冒泡。另一个控件将处理它,我假设这会导致
ContextMenu
关闭。