Pregunta

así que he adjuntado un menú contextual (botón derecho del ratón) a un listview WPF.

Por desgracia, al hacer clic en él trae tanto el menú como selecciona cualquier elemento que tiene más. ¿Hay una manera de apagar el clic con el botón derecho el comportamiento de selección al tiempo que permite el menú contextual?

¿Fue útil?

Solución

La clave es establecer el evento PreviewMouseRightButtonDown en el lugar correcto. Como se dará cuenta, incluso sin un derecho ContextMenu clic en un ListViewItem seleccionará ese elemento, y por lo tanto tenemos que establecer el evento en cada artículo, no en el 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;
}

Desde los acontecimientos de vista previa son túnel esto bloqueará el RightMouseButtonDown de que ocurre en los ListViewItems que les impiden ser seleccionado, pero no impide que el RightMouseButtonDown en el ListView y así todavía permiten el ContextMenu para abrir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top