2008-12-02 38 views
13

Cuando se hace clic en un elemento en el cuadro de lista de verificación, se resalta. ¿Cómo puedo evitar este efecto de resaltado?¿Cómo deshacerse del efecto de resaltado de selección de checklistbox?

Puedo conectarme al evento SelectedIndexChanged y borrar la selección, pero el resaltado aún ocurre y se ve una señal. De hecho, si mantiene presionado el botón del mouse, nunca lo suelta después de hacer clic en el área de la casilla de verificación, la selección permanece resaltada hasta que suelta el botón del mouse. Básicamente quiero deshacerme de este efecto de realce por completo.

Respuesta

11

esto lo hará aparte de usted todavía obtener el bit de línea de puntos.

this.checkedListBox1.SelectionMode = System.Windows.Forms.SelectionMode.None; 

aunque ahora no puede hacer clic las casillas de verificación ... por lo que tendrá que hacer algo así:

private void checkedListBox1_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < checkedListBox1.Items.Count; i++) 
     { 


      if (checkedListBox1.GetItemRectangle(i).Contains(checkedListBox1.PointToClient(MousePosition))) 
      { 
       switch (checkedListBox1.GetItemCheckState(i)) 
       { 
        case CheckState.Checked: 
         checkedListBox1.SetItemCheckState(i, CheckState.Unchecked); 
         break; 
        case CheckState.Indeterminate: 
        case CheckState.Unchecked: 
         checkedListBox1.SetItemCheckState(i, CheckState.Checked); 
         break; 
       } 

      } 

     } 
    } 

si todo eso no es lo que buscas .. que siempre puedes hacer tu propio. es un control bastante simple.

+3

parece que sería ser más eficiente para usar checkListBox1.IndexFromPoint (por ejemplo, ey) en el controlador MouseDown, en su lugar o f bucle a través de los resultados de GetItemRectangle. – Eyal

7

Establecer SelectionMode en None tiene algunos problemas extraños como tener que implementar el evento Click. Puede dejar SelectionMode en single y luego crear una clase que anule CheckedListBox con solo OnDrawItem. Tenga en cuenta que para desactivar una apariencia seleccionada, debe desactivar el estado Seleccionado y establecer los colores a lo que desea. Puedes obtener el color original del control como lo hice aquí. Esto es lo que se me ocurrió y debería comenzar a hacer que parezca como quieras.

public partial class EnhancedCheckedListBox : CheckedListBox 
{ 
    /// <summary>Overrides the OnDrawItem for the CheckedListBox so that we can customize how the items are drawn.</summary> 
    /// <param name="e">The System.Windows.Forms.DrawItemEventArgs object with the details</param> 
    /// <remarks>A CheckedListBox can only have one item selected at a time and it's always the item in focus. 
    /// So, don't draw an item as selected since the selection colors are hideous. 
    /// Just use the focus rect to indicate the selected item.</remarks> 
    protected override void OnDrawItem(DrawItemEventArgs e) 
    { 
     Color foreColor = this.ForeColor; 
     Color backColor = this.BackColor; 

     DrawItemState s2 = e.State; 

     //If the item is in focus, then it should always have the focus rect. 
     //Sometimes it comes in with Focus and NoFocusRect. 
     //This is annoying and the user can't tell where their focus is, so give it the rect. 
     if ((s2 & DrawItemState.Focus) == DrawItemState.Focus) 
     { 
      s2 &= ~DrawItemState.NoFocusRect; 
     } 

     //Turn off the selected state. Note that the color has to be overridden as well, but I just did that for all drawing since I want them to match. 
     if ((s2 & DrawItemState.Selected) == DrawItemState.Selected) 
     { 
      s2 &= ~DrawItemState.Selected; 

     } 

     //Console.WriteLine("Draw " + e.Bounds + e.State + " --> " + s2); 

     //Compile the new drawing args and let the base draw the item. 
     DrawItemEventArgs e2 = new DrawItemEventArgs(e.Graphics, e.Font, e.Bounds, e.Index, s2, foreColor, backColor); 
     base.OnDrawItem(e2); 
    } 
} 
+0

Me encanta esta solución, pero sin un pequeño tweak causó que mi vista 'Form1.cs [Design]' se bloqueara.Agregando un simple try/catch alrededor de todo el bloque de método, con el siguiente código solucionó el problema y ahora funciona maravillosamente: 'catch (Exception) {base.OnDrawItem (e); } ' – Michael

21

utilizar lo siguiente:

private void checkedListBox1__SelectedIndexChanged(object sender, EventArgs e) 
     { 
      checkedListBox1.ClearSelected(); 
     } 
+0

Brillantemente simple. – KoZm0kNoT

+0

Pero esto evitaría que marque/desmarque elementos ... – horgh

+0

tanques me está volviendo loco. es como si el cuadro de lista marcada tiene múltiples estados de selección ... ¿por qué querría esto como predeterminado? –

0

ooh fresco añadir poner todo el código de respuesta de Hath en un

checkedListBox1_MouseMove(object sender, MouseEventArgs e) 

Agregar a si el bit botón del ratón en el conmutador

case CheckState.Checked: 
    if (e.Button == MouseButtons.Right) 
    { 
     checkedListBox1.SetItemCheckState(i, CheckState.Unchecked); 
    }      
    break; 

a nd

case CheckState.Unchecked: 
    if (e.Button == MouseButtons.Left) 
    { 
     checkedListBox1.SetItemCheckState(i, CheckState.Checked); 
    } 
    break; 

y comprobará los elementos resaltados al mover el ratón con el botón izquierdo presionado y los no-resalte con derecho

0

Estoy un poco tarde para dar una respuesta aquí. De todos modos, esta desmarque hará todos casillas de verificación y retire la destacando efecto:

foreach (int i in clb.CheckedIndices) //clb is your checkListBox 
    clb.SetItemCheckState(i, CheckState.Unchecked); 
clb.SelectionMode = System.Windows.Forms.SelectionMode.None; 
clb.SelectionMode = System.Windows.Forms.SelectionMode.One; 
  • Desactive todas las casillas de selección
  • desactivación de CheckListBox
  • Habilitar la selección de CheckListBox
Cuestiones relacionadas