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:
Estilo predeterminado con todo tu setter y triggers.
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>