9

所以我已将上下文菜单(右键菜单)附加到 wpf 列表视图。

不幸的是,当您右键单击时,它会同时显示菜单并选择您结束的任何项目。有没有办法在仍然允许上下文菜单的同时关闭这种右键单击选择行为?

4

1 回答 1

22

关键是将 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;
}

Since the preview events are tunneling this will block the RightMouseButtonDown from occurring on the ListViewItems preventing them from being selected, but not prevent the RightMouseButtonDown on the ListView and so still allow the ContextMenu to open.

于 2009-07-02T16:31:12.853 回答