wpf listview проблема с правым кликом

поэтому я прикрепил контекстное меню (меню, вызываемое правой кнопкой мыши) к списку wpf.

к сожалению, когда вы щелкаете правой кнопкой мыши, он вызывает как меню, так и выбирает любой элемент, над которым вы работаете. Есть ли способ отключить это поведение выбора правой кнопкой мыши, сохраняя при этом контекстное меню?


person KevinDeus    schedule 02.07.2009    source источник


Ответы (1)


Ключом является установка события PreviewMouseRightButtonDown в правильном месте. Как вы заметите, даже без ContextMenu щелчок правой кнопкой мыши на ListViewItem выберет этот элемент, поэтому нам нужно установить событие для каждого элемента, а не для ListView.

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <EventSetter Event="PreviewMouseRightButtonDown"
                         Handler="OnListViewItemPreviewMouseRightButtonDown" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Menu Item">Item 1</MenuItem>
            <MenuItem Header="Menu Item">Item 2</MenuItem>
        </ContextMenu>
    </ListView.ContextMenu>
    <ListViewItem>Item</ListViewItem>
    <ListViewItem>Item</ListViewItem>
    <ListViewItem>Item</ListViewItem>
    <ListViewItem>Item</ListViewItem>
    <ListViewItem>Item</ListViewItem>
    <ListViewItem>Item</ListViewItem>
</ListView>


private void OnListViewItemPreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    Trace.WriteLine("Preview MouseRightButtonDown");

    e.Handled = true;
}

Поскольку события предварительного просмотра являются туннелированием, это заблокирует появление RightMouseButtonDown на ListViewItems, предотвращающие их выбор, но не предотвращающие RightMouseButtonDown в ListView и, таким образом, позволяющие открывать ContextMenu.

person rmoore    schedule 02.07.2009