template item combo wpf background styles

template - wpf combobox items



WPF: El disparador para ListBoxItem.IsSelected no funciona para la propiedad de fondo (4)

Intenta agregar esto a tus recursos de ventana -

<Window.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red" /> </Window.Resources>

Y elimine el Activador IsSelected de su código, no funcionará porque cada sistema tiene su pincel de resaltado predeterminado según el tema de su sistema.

Debe anular el pincel de resaltado en su código para que funcione.

Intento cambiar la propiedad de Background para mi ListBoxItem s usando desencadenantes en el ItemContainerStyle de mi ListBox siguiente manera:

<ListBox Height="100" HorizontalAlignment="Left" Margin="107,59,0,0" Name="listBox1" VerticalAlignment="Top" Width="239"> <ListBox.ItemContainerStyle> <Style TargetType="{x:Type ListBoxItem}"> <Setter Property="Background" Value="Lightblue"/> <Style.Triggers> <Trigger Property="IsSelected" Value="true"> <Setter Property="Background" Value="Red"/> </Trigger> <Trigger Property="IsMouseOver" Value="true"> <Setter Property="Background" Value="Yellow"/> </Trigger> </Style.Triggers> </Style> </ListBox.ItemContainerStyle> <ListBox.Items> <ListBoxItem Content="First Item"/> <ListBoxItem Content="SecondItem"/> <ListBoxItem Content="Third Item"/> </ListBox.Items> </ListBox>

Espero que los elementos no seleccionados tengan un fondo azul claro, que los elementos desplazados (es decir, cuando el cursor del mouse está sobre ellos) sean de color amarillo y que los elementos seleccionados sean de color rojo.

Para los elementos no seleccionados y desplazados, esto funciona como se esperaba, pero los elementos seleccionados todavía tienen su color de fondo estándar (es decir, azul, si el cuadro de lista tiene el foco y gris claro de lo contrario).

¿Hay algo que me falta? ¿Está este comportamiento documentado en alguna parte?

Gracias por cualquier pista!

EDITAR

Soy consciente de la solución de anular los colores predeterminados del sistema (como se describe en Cambiar el estilo de cuadro de lista seleccionado y desenfocado para que no esté en gris , gracias de todos modos a todos los que publicaron esto como una respuesta). Sin embargo esto no es lo que quiero hacer. Estoy más interesado en por qué mi solución no funciona.

Sospecho que el ControlTemplate estándar de ListItem para definir sus propios desencadenantes que parecen tener prioridad sobre los desencadenantes definidos (tal vez alguien podría confirmar esto y señalarme algún recurso donde se defina este comportamiento).

Mi solución para el entretanto es definir un ControlTemplate para mis ListItem s como:

<ListBox.ItemContainerStyle> <Style TargetType="{x:Type ListBoxItem}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListBoxItem"> <Border Name="Border" Padding="2" SnapsToDevicePixels="true" Background="LightBlue" Margin="0"> <ContentPresenter/> </Border> <ControlTemplate.Triggers> <Trigger Property="IsSelected" Value="true"> <Setter TargetName="Border" Property="Background" Value="Red"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </ListBox.ItemContainerStyle>


Intente utilizar Selector.IsSelected en su Trigger en lugar de IsSelected.


Un poco de reflexión sobre el estilo Aero nos ofrece una explicación de por qué este simple ajuste de disparador no funciona.

El ListBoxItem tiene un ControlTemplate con disparadores que tiene prioridad sobre nuestro disparador. Al menos esto parece ser cierto para un MultiTrigger. He logrado anular el desencadenante simple de Selected = true, pero para el multigigador tuve que hacer mi propia ControlTemplate.

Esta es la plantilla del estilo Aero que muestra el MultiTrigger problemático:

<ControlTemplate TargetType="{x:Type ListBoxItem}"> <ControlTemplate.Triggers> <Trigger Property="IsSelected" Value="true"> <Setter TargetName="Bd" Value="{DynamicResource {x:Static HighlightBrush}}" Property="Background" /> <Setter Value="{DynamicResource {x:Static HighlightTextBrush}}" Property="Foreground" /> </Trigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsSelected" Value="true" /> <Condition Property="IsSelectionActive" Value="false" /> </MultiTrigger.Conditions> <Setter TargetName="Bd" Value="{DynamicResource {x:Static ControlBrush}}" Property="Background" /> <Setter Value="{DynamicResource {x:Static ControlTextBrush}}" Property="Foreground" /> </MultiTrigger> <Trigger Property="IsEnabled" Value="false"> <Setter Value="{DynamicResource {x:Static GrayTextBrush}}" Property="Foreground" /> </Trigger> </ControlTemplate.Triggers> <Border Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> </Border> </ControlTemplate>

Espero que se aclare un poco las cosas. No puedo entender por qué han complicado demasiado el estilo.


eliminar el activador IsSelected y agregarlo al cuadro de lista:

<ListBox.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red" /> <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Red" /> </ListBox.Resources>

Primer cepillo para segundo enfocado por lo contrario