C# WPF显示GridView的上下文菜单';单击鼠标左键时显示的列标题

C# WPF显示GridView的上下文菜单';单击鼠标左键时显示的列标题,c#,wpf,gridview,contextmenu,C#,Wpf,Gridview,Contextmenu,我想在用户左键单击GridView的列标题时显示上下文菜单。以下是我目前的代码: <GridView> <GridViewColumn DisplayMemberBinding="{Binding}"> <GridViewColumnHeader Content="Customer" Click="Header_Click" > <Gr

我想在用户左键单击GridView的列标题时显示上下文菜单。以下是我目前的代码:

<GridView>
    <GridViewColumn DisplayMemberBinding="{Binding}">
        <GridViewColumnHeader
            Content="Customer"
            Click="Header_Click"
            >
            <GridViewColumnHeader.ContextMenu>
                <ContextMenu Name="ContextMenu">
                    <MenuItem Header="Sort by Customer" />
                    <MenuItem Header="Sort by Address" />
                </ContextMenu>
            </GridViewColumnHeader.ContextMenu>
        </GridViewColumnHeader>
    </GridViewColumn>
</GridView>
请注意,GridView由自定义ListView类托管,该类在
GridViewColumnHeader上有一个事件侦听器。ClickEvent
。但是,当在代码隐藏的事件侦听器上设置
e.Handled
时,它会阻止事件向上冒泡

我的问题是,当点击标题时,上下文菜单会很快出现在屏幕上,然后立即关闭。我相信标题不知怎么地失去了焦点,这就是上下文菜单关闭的原因。即使将
StaysOpen
属性设置为
true
也无法解决问题

另外请注意,右键单击列标题时,关联菜单的行为正确


那么,有什么建议可以阻止上下文菜单关闭吗?

这里的问题是,鼠标单击会导致多个事件。在您的情况下,
MouseDown
MouseUp
事件(或两者)执行单击标题的默认操作(我猜是排序)。我能重现你描述的那种行为。要修复此行为,可以注册
MouseDown
MouseUp
事件并触发关联菜单

<GridView>
    <GridViewColumn DisplayMemberBinding="{Binding Path=Customers}">
        <GridViewColumnHeader
            Content="Customer"
            MouseDown="GridViewColumnHeader_MouseDown" MouseUp="GridViewColumnHeader_MouseDown">
            <GridViewColumnHeader.ContextMenu>
                <ContextMenu Name="TheContextMenu">
                    <MenuItem Header="Sort by Customer" />
                    <MenuItem Header="Sort by Address" />
                </ContextMenu>
            </GridViewColumnHeader.ContextMenu>
        </GridViewColumnHeader>
    </GridViewColumn>
</GridView>

有点像编辑:我只是玩了一会儿。看来
MouseUp
事件已经足够了。

是的,非常感谢!似乎是将事件设置为
MouseDown
(或
MouseUp
)而不是
单击
,这样做了。
<GridView>
    <GridViewColumn DisplayMemberBinding="{Binding Path=Customers}">
        <GridViewColumnHeader
            Content="Customer"
            MouseDown="GridViewColumnHeader_MouseDown" MouseUp="GridViewColumnHeader_MouseDown">
            <GridViewColumnHeader.ContextMenu>
                <ContextMenu Name="TheContextMenu">
                    <MenuItem Header="Sort by Customer" />
                    <MenuItem Header="Sort by Address" />
                </ContextMenu>
            </GridViewColumnHeader.ContextMenu>
        </GridViewColumnHeader>
    </GridViewColumn>
</GridView>
private void GridViewColumnHeader_MouseDown(object sender, MouseButtonEventArgs e)
{
    TheContextMenu.IsOpen = true;
    e.Handled = true;
}