c# wpf xaml checkbox listbox

c# - Cambiar el color de selección del elemento ListBox



wpf xaml (2)

Deberá hacer eso en el código controlando los eventos CheckBox.Checked y CheckBox.Unchecked , ya que no creo que pueda agregar o eliminar Resources usando un Trigger en XAML. Sin embargo, las propiedades de la clase SystemColors son de solo lectura, por lo que tampoco puede configurarlas directamente.

Hay una manera que encontré, pero que implica la importación del método kkk desde el user32.dll , por lo que podría no ser para la fiebre del corazón. Para obtener más información, consulte la página SetSysColors (user32) en el sitio web de pinvoke.net. Desde la página enlazada:

[DllImport("user32.dll", SetLastError=true)] public static extern bool SetSysColors(int cElements, int [] lpaElements, int [] lpaRgbValues); public const int COLOR_DESKTOP = 1; //example color System.Drawing.Color sampleColor = System.Drawing.Color.Lime; //array of elements to change int[] elements = {COLOR_DESKTOP}; //array of corresponding colors int[] colors = {System.Drawing.ColorTranslator.ToWin32(sampleColor)}; //set the desktop color using p/invoke SetSysColors(elements.Length, elements, colors); //save value in registry so that it will persist Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Control Panel//Colors", true); key.SetValue(@"Background", string.Format("{0} {1} {2}", sampleColor.R, sampleColor.G, sampleColor.B));

Tengo un ListBox normal y quiero cambiar el color de selección a Rojo. Esto es lo que tengo hasta ahora.

<Style x:Key="myLBStyle" TargetType="{x:Type ListBoxItem}"> <Style.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="red" /> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="red" /> </Style.Resources> </Style>

Esta funcionando. El elemento seleccionado es rojo y permanece rojo incluso si está desenfocado.

Este es mi problema real: en mi grilla también tengo un CheckBox y quiero que el estilo anterior se aplique solo si CheckBox está marcado.

Entonces, si CheckBox está marcado, quiero que el color de selección sea Rojo y sea Azul (o color predeterminado) si CheckBox está desmarcado.

Revisé la web y no encuentro nada, así que estoy buscando ayuda.


Puedes tener dos estilos separados:

  1. Estilo predeterminado con todo tu setter y triggers.

  2. Estilo en blanco con los recursos definidos en él y hacer que este estilo esté BasedOn el estilo predeterminado para que todos los instaladores y desencadenantes se hereden del estilo predeterminado.

Y luego puede cambiar ItemContainerStyle en función del estado comprobado de CheckBox.

Muestra:

<StackPanel> <StackPanel.Resources> <Style x:Key="myLBStyleDefault"> <!-- All setters and triggers go here --> </Style> <Style x:Key="myLBStyleWithRed" BasedOn="{StaticResource myLBBaseStyle}" TargetType="{x:Type ListBoxItem}"> <Style.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red" /> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Red" /> </Style.Resources> </Style> </StackPanel.Resources> <CheckBox x:Name="chk"/> <ListBox> <ListBox.Style> <Style TargetType="ListBox"> <Setter Property="ItemContainerStyle" Value="{StaticResource myLBStyleDefault}"/> <Style.Triggers> <DataTrigger Binding="{Binding IsChecked, ElementName=chk}" Value="True"> <Setter Property="ItemContainerStyle" Value="{StaticResource myLBStyleWithRed}"/> </DataTrigger> </Style.Triggers> </Style> </ListBox.Style> </ListBox> </StackPanel>