2010-06-09 17 views
6

La parte difícil es que cada artículo tiene un ContextMenu que todavía quiero abrir cuando se hace clic derecho (simplemente no quiero que lo seleccione).¿Cómo puedo evitar que ListBox seleccione un elemento cuando hago clic con el botón derecho?

De hecho, si hace las cosas más fáciles, no quiero ninguna selección automática de, así que si hay alguna manera de poder deshabilitarla por completo, estaría bien.

Estoy pensando en cambiar a un ItemsControl en realidad, siempre y cuando pueda obtener la virtualización y el desplazamiento para trabajar con él.

Respuesta

16

Si no quiere la selección definitivamente iría con ItemsControl no ListBox. La virtualización y el desplazamiento se pueden usar con un ItemsControl simple siempre que estén en la plantilla.

Por otro lado, si lo que necesita la selección, pero simplemente no desea que el botón derecho del ratón para seleccionar la forma más sencilla es probablemente para controlar el evento PreviewRightMouseButtonDown:

void ListBox_PreviewRightMouseButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    e.Handled = true; 
} 

La razón por la que esto funciona es que ListBoxItem la selección ocurre en el mouse abajo pero la apertura del menú contextual ocurre en el mouse hasta. Por lo tanto, eliminar el evento del mouse hacia abajo durante la fase de vista previa resuelve su problema.

Sin embargo, esto no funciona si desea que el mouse hacia abajo se maneje en otro lugar dentro de su ListBox (como en un control dentro de un elemento). En este caso, la forma más fácil es, probablemente, a la subclase ListBoxItem ignorarlo:

public class ListBoxItemNoRightClickSelect : ListBoxItem 
{ 
    protected override void OnMouseRightButtonDown(MouseButtonEventArgs e) 
    { 
    } 
} 

Usted puede construir de forma explícita estos ListBoxItems en su ItemsSource o puede también ListBox subclase de utilizar sus artículos personalizados de forma automática:

public class ListBoxNoRightClickSelect : ListBox 
{ 
    protected override DependencyObject GetContainerForItemOverride() 
    { 
    return new ListBoxItemNoRightClickSelect(); 
    } 
} 

FYI, aquí hay algunas soluciones que no funcionan junto con las explicaciones de por qué no funcionará:

  • no se puede simplemente agregar un controlador MouseRightButtonDown en cada ListaB oxItem porque el controlador de clase registrados se llamará antes que la suya
  • Usted no puede manejar MouseRightButtonDown en ListBox ya que el evento se dirige directamente a cada control individualmente
+0

Gracias - Terminé yendo la ruta ItemsControl, (implementado como aquí http://stackoverflow.com/questions/2783845/wpf-virtualizing-an-itemscontrol) y no solo ahora funciona como me gustaría, ¡el rendimiento aumentó notablemente también! – devios1

Cuestiones relacionadas