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

时间:2011-07-25 12:43:50

标签: c# wpf gridview contextmenu

当用户左键单击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,也无法解决问题。

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

那么有关如何停止关闭上下文菜单的任何建议吗?

1 个答案:

答案 0 :(得分:2)

这里的问题是鼠标单击会导致多个事件。在您的情况下,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事件就足够了。