Điều quan trọng là đặt sự kiện PreviewMouseRightButtonDown ở đúng vị trí. Như bạn sẽ thấy, ngay cả khi không có ContextMenu, việc nhấn chuột phải vào một ListViewItem sẽ chọn mục đó, và vì vậy chúng ta cần thiết lập sự kiện trên mỗi mục chứ không phải trên 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;
}
Kể từ khi sự kiện preview là tunneling này sẽ chặn RightMouseButtonDown xảy ra trên ListViewItems ngăn ngừa chúng khỏi bị được lựa chọn, nhưng không ngăn cản việc RightMouseButtonDown trên ListView và do đó vẫn cho phép các ContextMenu để mở.
có điều này là chính xác những gì tôi cần. Nó hoạt động hoàn hảo. Cảm ơn! – KevinDeus