WPF左键单击时显示GridView's列标题的上下文菜单

本文关键字:标题 菜单 上下文 单击 GridView 显示 WPF | 更新日期: 2023-09-27 18:03:30

我想在用户左击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>

和后面的代码:

private void Header_Click(object sender, RoutedEventArgs e)
{
    ContextMenu.IsOpen = true;
    e.Handled = true;
}

请注意,GridView是由自定义的ListView类托管的,该类在GridViewColumnHeader.ClickEvent上有一个事件侦听器。但是,当在事件侦听器后面的代码上设置e.Handled时,它会阻止事件向上冒泡。

我的问题是,当点击标题时,上下文菜单只是快速出现在屏幕上,之后关闭。我认为标题不知何故失去了焦点,这就是上下文菜单关闭的原因。即使将StaysOpen属性设置为true也不能解决问题。

还请注意,当右键单击列标题时,上下文菜单的行为是正确的。

有什么建议如何阻止上下文菜单关闭吗?

WPF左键单击时显示GridView's列标题的上下文菜单

这里的问题是鼠标单击会导致几个事件。在您的情况下,MouseDownMouseUp事件(或两者)执行默认操作单击标题(排序我猜)。我能重现你描述的行为。为了解决这个问题,你可以注册MouseDownMouseUp事件并触发上下文菜单。

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

我使用了两次GridViewColumnHeader_MouseDown,这可能有点脏:)

private void GridViewColumnHeader_MouseDown(object sender, MouseButtonEventArgs e)
{
    TheContextMenu.IsOpen = true;
    e.Handled = true;
}

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