ventajas sobre form c# wpf windows-8

c# - sobre - Configuración del color de fondo o WPF(4.0) ListBox-Windows 8



wpf uwp (3)

Estoy intentando establecer que el color de fondo de un ListBoxItem seleccionado sea blanco en lugar del color del sistema. He leído lo que pude encontrar aquí en SO y he seguido, o se cree que ha seguido las recomendaciones allí ( Cambiar el color de fondo para el elemento ListBox seleccionado , WPF Cómo cambiar el color del texto del ítem del cuadro de lista seleccionado cuando el cuadro de lista pierde el foco , Cambiar seleccionado y el estilo de cuadro de lista desenfocado para no estar en gris , y otros).

Todos parecen resolver el problema configurando HighlightBrush y ControlBrush en Transparent para el elemento seleccionado. Tengo el siguiente XAML y establece el color de la fuente correctamente, pero el fondo es el azul transparente predeterminado, independientemente de la configuración del pincel. Todavía soy un poco novato de WPF, así que debo estar perdiendo algo simple aquí.

<ListBox Width="Auto" Height="Auto" Grid.Column="0" BorderThickness="0" Background="#FFF3F3F3" xmlns:sys="clr-namespace:System;assembly=mscorlib"> <ListBox.ItemsSource> <x:Array Type="{x:Type sys:String}"> <sys:String>String 1</sys:String> <sys:String>String 2</sys:String> <sys:String>String 3</sys:String> <sys:String>String 4</sys:String> </x:Array> </ListBox.ItemsSource> <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}"> <Style.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" /> </Style.Resources> <Setter Property="HorizontalContentAlignment" Value="Stretch" /> <Setter Property="FontSize" Value="16"/> <Setter Property="Foreground" Value="#999999"/> <Style.Triggers> <Trigger Property="IsSelected" Value="True" > <Setter Property="Background" Value="White" /> <Setter Property="Foreground" Value="Black" /> </Trigger> </Style.Triggers> </Style> </ListBox.ItemContainerStyle> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding}" HorizontalAlignment="Right" Margin="0,0,8,0" Background="Transparent"/> </DataTemplate> </ListBox.ItemTemplate> </ListBox>

Apreciaría cualquier codazo en la dirección correcta.

EDITAR :

Después de leer la primera respuesta que funcionó para ellos con un ligero cambio, tomé la aplicación que he estado desarrollando en mi máquina con Windows 8 y la ejecuté en una máquina virtual con Windows 7 y funcionó como se esperaba. ¿Alguna idea sobre qué debe cambiar para que esto funcione en una máquina con Windows 8 y en Windows 7?


¿Así que simplemente desea que el fondo del elemento seleccionado sea blanco?

Tu código menos la configuración de ControlBrushKey me funciona:

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


Agregando el siguiente desencadenante a mi plantilla de datos del artículo, funcionó para Windows 10:

<DataTemplate x:Key="MyItemTemplate"> <Border Name="Border" Background="Transparent" BorderBrush="LightGray" BorderThickness="0,1,0,0" Padding="0"> <TextBlock Text="{Binding Text}" HorizontalAlignment="Left" FontWeight="Medium" /> </Border> <DataTemplate.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True"> <Setter TargetName="Border" Property="Background" Value="SkyBlue"/> </DataTrigger> </DataTemplate.Triggers> </DataTemplate>


Esas publicaciones se están desactualizando para Windows-8.

En Windows-8, por alguna razón, Microsoft no quiere que la gente edite sus Style predeterminados tan fácilmente o algo así con un over-ride de Brush .

ListBoxItem Style predeterminado de ListBoxItem de VS tiene esto para los desencadenantes de selección:

<MultiTrigger> <MultiTrigger.Conditions> <Condition Property="Selector.IsSelectionActive" Value="False" /> <Condition Property="IsSelected" Value="True" /> </MultiTrigger.Conditions> <Setter TargetName="Bd" Property="Background" Value="#3DDADADA" /> <Setter TargetName="Bd" Property="BorderBrush" Value="#FFDADADA" /> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="Selector.IsSelectionActive" Value="True" /> <Condition Property="IsSelected" Value="True" /> </MultiTrigger.Conditions> <Setter TargetName="Bd" Property="Background" Value="#3D26A0DA" /> <Setter TargetName="Bd" Property="BorderBrush" Value="#FF26A0DA" /> </MultiTrigger>

Los activadores para el estado de Selección ya no están aplicando pinceles, podemos anularlos fácilmente, pero son colores estáticos. Por lo tanto, para modificarlo, necesitará derivar la plantilla y modificar el desencadenante allí. a White

Este es el estilo completo dado por VS2012 Windows-8 para ListBoxItem

<Style x:Key="ListBoxItemStyle1" TargetType="{x:Type ListBoxItem}"> <Setter Property="SnapsToDevicePixels" Value="True" /> <Setter Property="Padding" Value="4,1" /> <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ItemsControl}}}" /> <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ItemsControl}}}" /> <Setter Property="Background" Value="Transparent" /> <Setter Property="BorderBrush" Value="Transparent" /> <Setter Property="BorderThickness" Value="1" /> <Setter Property="FocusVisualStyle"> <Setter.Value> <Style> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate> <Rectangle Margin="2" SnapsToDevicePixels="True" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeDashArray="1 2" StrokeThickness="1" /> </ControlTemplate> </Setter.Value> </Setter> </Style> </Setter.Value> </Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ListBoxItem}"> <Border x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True"> <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" ContentTemplate="{TemplateBinding ContentTemplate}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> </Border> <ControlTemplate.Triggers> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsMouseOver" Value="True" /> </MultiTrigger.Conditions> <Setter TargetName="Bd" Property="Background" Value="#1F26A0DA" /> <Setter TargetName="Bd" Property="BorderBrush" Value="#A826A0DA" /> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="Selector.IsSelectionActive" Value="False" /> <Condition Property="IsSelected" Value="True" /> </MultiTrigger.Conditions> <Setter TargetName="Bd" Property="Background" Value="#3DDADADA" /> <Setter TargetName="Bd" Property="BorderBrush" Value="#FFDADADA" /> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="Selector.IsSelectionActive" Value="True" /> <Condition Property="IsSelected" Value="True" /> </MultiTrigger.Conditions> <Setter TargetName="Bd" Property="Background" Value="#3D26A0DA" /> <Setter TargetName="Bd" Property="BorderBrush" Value="#FF26A0DA" /> </MultiTrigger> <Trigger Property="IsEnabled" Value="False"> <Setter TargetName="Bd" Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>

Si modifica esos disparadores a:

<MultiTrigger> <MultiTrigger.Conditions> <Condition Property="Selector.IsSelectionActive" Value="False" /> <Condition Property="IsSelected" Value="True" /> </MultiTrigger.Conditions> <Setter TargetName="Bd" Property="Background" Value="White" /> <Setter TargetName="Bd" Property="BorderBrush" Value="White" /> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="Selector.IsSelectionActive" Value="True" /> <Condition Property="IsSelected" Value="True" /> </MultiTrigger.Conditions> <Setter TargetName="Bd" Property="Background" Value="White" /> <Setter TargetName="Bd" Property="BorderBrush" Value="White" /> </MultiTrigger>

Usted debe tener su problema resuelto.