WPF Отображение контекстного меню для заголовка столбца GridView при щелчке левой кнопкой мыши - PullRequest
1 голос
/ 25 июля 2011

Я хочу отобразить контекстное меню, когда пользователь щелкает левой кнопкой мыши заголовок столбца 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 Ответ

2 голосов
/ 25 июля 2011

проблема здесь в том, что щелчок мышью вызывает несколько событий.В вашем случае событие 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>

Я дважды использую GridViewColumnHeader_MouseDown, что может быть немного грязно :)

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

Вроде редактирования: я просто немного поиграл.Похоже, что события MouseUp достаточно.

...