visual una texto tema studio sola poner para pagina fondo diferentes con como colores color codigo cambiar c# winforms listview focus backcolor

c# - una - como poner diferentes colores de pagina en word



¿Cómo cambiar la vista de lista del color de fondo seleccionado incluso cuando se enfoca en otro control? (6)

Aquí hay una solución para un ListView que no permite selecciones múltiples y no tiene imágenes (por ejemplo, casillas de verificación).

  1. Establezca los controladores de eventos para ListView (en este ejemplo se llama listView1 ):
    • DrawItem
    • Leave (invocado cuando se pierde el foco de ListView)
  2. Declare una variable int global (es decir, un miembro del formulario que contiene el ListView, en este ejemplo se llama gListView1LostFocusItem ) y asígnele el valor -1
    • int gListView1LostFocusItem = -1;
  3. Implemente los controladores de eventos de la siguiente manera:

    private void listView1_Leave(object sender, EventArgs e) { // Set the global int variable (gListView1LostFocusItem) to // the index of the selected item that just lost focus gListView1LostFocusItem = listView1.FocusedItem.Index; } private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) { // If this item is the selected item if (e.Item.Selected) { // If the selected item just lost the focus if (gListView1LostFocusItem == e.Item.Index) { // Set the colors to whatever you want (I would suggest // something less intense than the colors used for the // selected item when it has focus) e.Item.ForeColor = Color.Black; e.Item.BackColor = Color.LightBlue; // Indicate that this action does not need to be performed // again (until the next time the selected item loses focus) gListView1LostFocusItem = -1; } else if (listView1.Focused) // If the selected item has focus { // Set the colors to the normal colors for a selected item e.Item.ForeColor = SystemColors.HighlightText; e.Item.BackColor = SystemColors.Highlight; } } else { // Set the normal colors for items that are not selected e.Item.ForeColor = listView1.ForeColor; e.Item.BackColor = listView1.BackColor; } e.DrawBackground(); e.DrawText(); }

Nota: Esta solución dará como resultado un poco de parpadeo. Una solución para esto implica la subclasificación del control ListView para que pueda cambiar la propiedad protegida DoubleBuffered a true.

public class ListViewEx : ListView { public ListViewEx() : base() { this.DoubleBuffered = true; } }

Tengo un programa que utiliza un escáner de código de barras como dispositivo de entrada, lo que significa que necesito mantener el foco en un cuadro de texto.

El programa tiene un control de vista de lista y selecciono uno de los elementos programáticamente cuando se escanea un determinado código de barras. Establecí el color de fondo de la fila de la siguiente manera:

listviewitem.BackColor = Color.LightSteelBlue;

Cosas que he intentado:

  • listview.HideSelection establecido en falso
  • llamar a listview.Focus() después de configurar el color
  • listviewitem.Focused establecido en true
  • llamar a listview.Invalidate
  • llamar a listview.Update()
  • llamar a listview.Refresh()
  • diferentes combinaciones de los anteriores

También hice combinaciones arriba de las cosas en un temporizador para que se llamen por un hilo diferente pero aún no tengan éxito.

¿Algunas ideas?

Más información:

  • La clave aquí es el foco de control. El control de vista de lista no tiene el foco cuando selecciono uno de los elementos.
  • Selecciono un elemento haciendo:

    listView1.Items[index].Selected = true;

  • el foco está siempre en el cuadro de texto.

  • la computadora no tiene teclado ni mouse, solo un lector de código de barras.

Tengo este código para mantener el foco en el cuadro de texto:

private void txtBarcode_Leave(object sender, EventArgs e) { this.txtBarcode.Focus(); }

Necesita tener un cuadro de texto para agregar ese código para simular mi problema.


En SelectedIndexChanged :

private void lBxDostepneOpcje_SelectedIndexChanged(object sender, EventArgs e) { ListViewItem item = lBxDostepneOpcje.FocusedItem as ListViewItem; ListView.SelectedIndexCollection lista = lBxDostepneOpcje.SelectedIndices; foreach (Int32 i in lista) { lBxDostepneOpcje.Items[i].BackColor = Color.White; } if (item != null) { item.Selected = false; if (item.Index == 0) { } else { lBxDostepneOpcje.Items[item.Index-1].BackColor = Color.White; } if (lBxDostepneOpcje.Items[item.Index].Focused == true) { lBxDostepneOpcje.Items[item.Index].BackColor = Color.LightGreen; if (item.Index < lBxDostepneOpcje.Items.Count-1) { lBxDostepneOpcje.Items[item.Index + 1].BackColor = Color.White; } } else if (lBxDostepneOpcje.Items[item.Index].Focused == false) { lBxDostepneOpcje.Items[item.Index].BackColor = Color.Blue; } } }


No puede establecer el foco en el control de vista de lista en esta situación. txtBarcode_Leave método txtBarcode_Leave evitará esto. Pero si desea poder seleccionar elementos de vista de lista haciendo clic en ellos, simplemente agregue el siguiente código al controlador de eventos MouseClick de listview:

private void listView1_MouseClick(object sender, MouseEventArgs e) { ListView list = sender as ListView; for (int i = 0; i < list.Items.Count; i++) { if (list.Items[i].Bounds.Contains(e.Location) == true) { list.Items[i].BackColor = Color.Blue; // highlighted item } else { list.Items[i].BackColor = SystemColors.Window; // normal item } } }


Simplemente hazlo así:

  1. Establecer propiedad UnfocusedHighlighForegroundColor = "Blue"
  2. Establecer propiedad UnfocusedHighlighBackgroundColor = "White"
  3. Establecer propiedad UserCustomSelectionColors = true

Buena suerte :)


Un ListView estándar no le permite establecer el color de fondo de una fila seleccionada . Los colores de fondo (y primer plano) de una fila seleccionada siempre están controlados por el tema del sistema operativo.

ObjectListView dibujar su ListView para evitar esto O puede usar ObjectListView . ObjectListView es un contenedor de código abierto alrededor de .NET WinForms ListView, que lo hace mucho más fácil de usar, y permite fácilmente cosas que son muy difíciles en un ListView normal, como cambiar los colores de las filas seleccionadas.

this.objectListView1.UseCustomSelectionColors = true; this.objectListView1.HighlightBackgroundColor = Color.Lime; this.objectListView1.UnfocusedHighlightBackgroundColor = Color.Lime;

Esto muestra el ObjectListView cuando no tiene foco.


Lo que describe funciona exactamente como se esperaba , suponiendo que ha establecido la propiedad HideSelection del control ListView en False. Aquí hay una captura de pantalla para demostraciones. Creé un proyecto en blanco, agregué un control ListView y un control TextBox a un formulario, agregué algunos elementos de muestra al ListView , establecí su vista en "Detalles" (aunque esto funciona en cualquier vista) y establecí HideSelection en falso. TextBox.Leave evento TextBox.Leave tal como lo mostró en la pregunta, y agregué una lógica simple para seleccionar el ListViewItem correspondiente cada vez que su nombre se ingresó en el TextBox . Tenga en cuenta que "Test Item Six" está seleccionado en ListView :

Ahora, como sospechaba inicialmente, vas a ensuciar las cosas si juegas con la configuración de la propiedad BackColor tú mismo . No estoy seguro de por qué querría hacer esto, ya que el control ya usa los colores de selección predeterminados para indicar los elementos seleccionados de forma predeterminada. Si desea utilizar diferentes colores, debe cambiar el tema de Windows, en lugar de intentar escribir el código para hacerlo.

De hecho, si agrego la línea de item.BackColor = Color.LightSteelBlue además de mi código existente para seleccionar el elemento ListViewItem corresponde al nombre escrito en el TextBox , obtengo exactamente lo mismo que se muestra arriba. El color de fondo del elemento no cambia hasta que establece el foco en el control. Ese es el comportamiento esperado , ya que los elementos seleccionados se ven diferentes cuando tienen el foco que cuando su control principal está desenfocado. Los elementos seleccionados en controles enfocados están pintados con el color de resaltado del sistema; los elementos seleccionados en los controles desenfocados se pintan con el color 3D del sistema. De lo contrario, sería imposible determinar si el control ListView tenía o no el foco. Además, cualquier propiedad BackColor personalizada es completamente ignorada por el sistema operativo cuando el control ListView tiene el foco. El fondo se pinta en el color de resaltado predeterminado del sistema.

Establecer explícitamente el foco en el control ListView , por supuesto, hace que el color de fondo personalizado se aplique al ListViewItem , y las cosas se renderizan con un color que contrasta mucho con el esquema de color que he seleccionado en mi computadora (recuerde, no todos usan los valores predeterminados). El problema, sin embargo, se vuelve obvio de inmediato: no puede establecer el foco en el control ListView debido al código que ha escrito en el método del controlador de eventos TextBox.Leave !

Puedo decirte en este momento que establecer el foco en un evento que cambia el enfoque es lo que no debes hacer. En Windows, es una regla difícil que no se le permita hacer cosas como esa, y la documentation incluso le advierte explícitamente que no lo haga. Presumiblemente, su respuesta será algo similar a "Tengo que hacerlo", pero eso no es excusa. Si todo funcionara como se esperaba, no harías esta pregunta en primer lugar.

¿Y ahora qué? El diseño de su aplicación está roto. Sugiero arreglarlo. No intente y cumpla con configurar la propiedad BackColor usted mismo para indicar que se ha seleccionado un elemento. Entra en conflicto con la forma predeterminada en que Windows resalta los elementos seleccionados. Además, no intente establecer el foco en un evento que cambie el enfoque. Windows lo prohíbe explícitamente, y la documentación es clara de que no se supone que debes hacer esto. Si la computadora objetivo no tiene un mouse o un teclado, no está claro cómo el usuario va a enfocar cualquier cosa en primer lugar, a menos que escriba código para hacerlo, lo que no debería hacer.

Pero sorprendentemente tengo poca fe en que querrás arreglar tu aplicación. Las personas que ignoran las advertencias en la documentación tienden a ser las mismas personas que no escuchan consejos bien intencionados sobre sitios de preguntas y respuestas. Así que te arrojaré un hueso y te diré cómo obtener el efecto que deseas de todos modos. La clave está en no configurar la propiedad Selected ListViewItem , lo que evita el conflicto entre BackColor personalizado y el color de resaltado predeterminado del sistema. También le libera de tener que establecer explícitamente el foco en el control ListView y viceversa (que, como establecimos anteriormente, no está realmente sucediendo, dado el método del controlador de eventos Leave ). Hacer eso produce el siguiente resultado:

Y aquí está el código: no es muy bonito, pero esto es solo una prueba de concepto, no una muestra de las mejores prácticas:

public partial class Form1 : Form { public Form1() { InitializeComponent(); listView1.View = View.Details; listView1.HideSelection = false; } private void textBox1_TextChanged(object sender, EventArgs e) { foreach (ListViewItem item in listView1.Items) { if (item.Text == textBox1.Text) { item.BackColor = Color.LightSteelBlue; return; } } } private void textBox1_Leave(object sender, EventArgs e) { this.textBox1.Focus(); } }