2009-03-30 17 views
31

Tengo un WPF ListBox realmente simple con SelectionMode configurado en Multiple.Cambiar el estilo de Listbox seleccionado y desenfocado para que no se vea gris

<ListBox SelectionMode="Multiple" /> 

Cuando el ListBox pierde el foco que es muy difícil saber lo que se ha seleccionado debido a los cambios de color de azul a la selección de un color gris claro. ¿Cuál es la forma más fácil de cambiar este comportamiento para que permanezca azul?

Sé que es probablemente algo relacionado con el estilo de ListItem, pero no puedo encontrar dónde.

Saludos.

similares: WPF ListView Inactive Selection Color

+0

Gracias por el Dupe Micah, pero no es exactamente lo mismo, ya que estoy hablando del ListBox no del ListView. Por eso no encontré al idiota. Sin embargo, no dice que la solución no funciona para ambos. – Ray

Respuesta

48

he hecho algo como esto utilizando la siguiente en una ResourceDictionary fusionado, puede ayudarle a:

<Style TargetType="ListBoxItem"> 
    <Style.Resources> 
     <!--SelectedItem with focus--> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightBlue" Opacity=".4"/> 
     <!--SelectedItem without focus--> 
     <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey }" Color="LightBlue" Opacity=".4"/> 
    </Style.Resources> 
</Style> 
+1

Muchas gracias por esto. –

+18

Use InactiveSelectionHighlightBrushKey en lugar de ControlBrushKey desde .NET 4.5. –

+6

Esto no parece funcionar para Windows-8 que usa colores estáticos en los activadores 'ControlTemplate' por defecto. Tendría que derivar el 'Style' básico y especificar los pinceles superpuestos en esos disparadores o dar los colores directamente. http://stackoverflow.com/questions/16819577/setting-background-color-or-wpf-4-0-listbox/16820062#16820062 – Viv

4

Probablemente puede resolver su problema por la re-escritura la plantilla, pero prueba esto para obtener un parche fácil.

<Style TargetType="ListViewItem"> 
    <Style.Resources> 
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Blue" /> 
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Blue" /> 
    </Style.Resources> 
</Style> 
10

Esta no es una respuesta a la pregunta, pero me encontré con esto cuando yo estaba buscando una manera de desactivar selecciones en mis cuadros de lista. Mediante el uso de una forma ligeramente modificada de la técnica de Guy's & bendewey anterior, resulta que puede dar la apariencia de que no hay selecciones en su cuadro de lista sin reemplazar el control de elementos subyacentes o algo por el estilo. Aquí está el código utilicé:

<Grid.Resources> 
    <Style TargetType="ListBoxItem"> 
    <Style.Resources> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="White" /> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> 
     <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="White" /> 
    </Style.Resources> 
    </Style> 
</Grid.Resources> 

También encontré la siguiente página de MSDN útil:

MSDN: SystemColors Members (System.Windows)

Gracias por la ayuda, chicos.

7

Una solución más completa sería tener el nuevo cepillo se refiere a highlightColor:

<Style TargetType="ListBox"> 
    <Setter Property="ItemContainerStyle"> 
     <Setter.Value> 
      <Style TargetType="ListBoxItem"> 
       <Style.Resources> 
        <SolidColorBrush x:Key="{x:Static Member=SystemColors.InactiveSelectionHighlightBrushKey}" 
            Color="{DynamicResource ResourceKey={x:Static Member=SystemColors.HighlightColorKey}}" /> 
       </Style.Resources> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

Esto garantizaría que utiliza el mismo color y coincide con el tema del sistema (incluso si los cambios de temas del sistema en tiempo de ejecución, gracias a DynamicResource).

Por cierto, parece que las versiones recientes de WPF ya no usan "ControlBrush" para esto, pero el más apropiado es "InactiveSelectionHighlightBrush".

+1

Esto no parece funcionar en Windows 10, ¿podría verificar si esto debería funcionar? – skiwi

0

También tengo este problema. Pero he resuelto mediante el uso de IsSynchronizedWithCurrentItem = "true":

<ListBox 
IsSynchronizedWithCurrentItem="True" /> 
0

Cuando los elementos seleccionados se convierten en gris es porque el control está perdiendo su foco lógico. Los controles múltiples tienen la capacidad de tener un enfoque lógico al mismo tiempo. Así que una solución simple a esto podría ser darle a su ListBox un FocusScope a través del FocusManager.

<ListBox SelectionMode="Multiple" FocusManager.IsFocusScope="True"></ListBox> 
Cuestiones relacionadas