wpf foreground contentpresenter

wpf - Cambiar el color de primer plano de un contentpresenter en un cuadro de lista



foreground (4)

Creé el siguiente estilo para un cuadro de lista que mostrará una imagen junto a un texto:

<Style x:Key="ImageListBoxStyle" TargetType="{x:Type ListBox}"> <Setter Property="SnapsToDevicePixels" Value="true"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/> <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> <Setter Property="ScrollViewer.CanContentScroll" Value="True"/> <Setter Property="ItemContainerStyle"> <Setter.Value> <!-- Simple ListBoxItem - This is used for each Item in a ListBox. The item''s content is placed in the ContentPresenter --> <Style TargetType="{x:Type ListBoxItem}"> <Setter Property="SnapsToDevicePixels" Value="true"/> <Setter Property="OverridesDefaultStyle" Value="true"/> <Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ListBoxItem}"> <Grid SnapsToDevicePixels="true"> <Border x:Name="Border"> <Grid Height="40"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Image x:Name="DisplayImage" Source="{Binding Path=ThumbnailImage}" Height="30" Width="30" Grid.Column="0"/> <ContentPresenter x:Name="DisplayText" HorizontalAlignment="Stretch" VerticalAlignment="Center" Grid.Column="1"/> <!--<ContentPresenter.Resources> <Style TargetType="{x:Type TextBlock}"> <Setter Property="Foreground" Value="Black"/> </Style> </ContentPresenter.Resources>--> <!--Content="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}, Path=DisplayMemberPath, Converter={StaticResource myDisplayMemberConverter}}"--> <!--<Label x:Name="Text" Content="{Binding Path=FullNameAndTitle}" Foreground="Black" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" VerticalContentAlignment="Center" HorizontalAlignment="Stretch" Grid.Column="1" Height="40"/>--> </Grid> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsSelected" Value="true"> <!--<Setter Property="FontWeight" Value="Bold" TargetName="DisplayText"/>--> <!--<Setter Property="Style" Value="{StaticResource SelectedTextStyle}" TargetName="DisplayText"/>--> <Setter Property="Background" Value="DarkBlue" TargetName="Border"/> <Setter Property="Width" Value="40" TargetName="DisplayImage"/> <Setter Property="Height" Value="40" TargetName="DisplayImage"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Setter.Value> </Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ListBox}"> <Grid> <Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="Black" BorderThickness="{TemplateBinding BorderThickness}"> <Grid> <ScrollViewer Margin="1,1,1,1" Focusable="false" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"> <StackPanel IsItemsHost="true"/> </ScrollViewer> </Grid> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsGrouping" Value="true"> <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>

Tengo que usar el contentpresenter porque estoy filtrando lo que se muestra (texto sabio) usando DisplayMemberPath del ListBox sí mismo.

Todo lo que quiero hacer es establecer FontWeight en negrita y el primer plano en blanco cuando se selecciona un elemento en el ListBox.

¿Alguien ha encontrado un problema como este? He visto algunas preguntas relacionadas pero la gente ha podido usar un TextBlock para resolver sus problemas. Desafortunadamente no puedo.

Cualquier información que la persona pueda dar será apreciada.

Aclamaciones


Está todo bien, he logrado responder a esta pregunta yo mismo, estaba intentando modificar el foreground / fontweight del contentpresenter que no contiene una definición para foreground / fontweight todo lo que simplemente necesitaba hacer era esto:

<Setter Property="FontWeight" Value="Bold"/> <Setter Property="Foreground" Value="White"/>

es decir, eliminar el:

TargetName="DisplayText"


También hay otra manera. Puedes agregar en tu ContentPresenter este atributo

TextBlock.Foreground="YourColour"

En este caso, también puede usar animaciones sobre esa propiedad.


<Storyboard x:Key="Storyboard1"> <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="myContentPresenter"> <EasingColorKeyFrame KeyTime="0" Value="Black"/> <EasingColorKeyFrame KeyTime="0:0:0.2" Value="White"/> </ColorAnimationUsingKeyFrames> </Storyboard>


En base a esta respuesta relacionada , pude resolver un problema similar con lo siguiente:

<Setter TargetName="ctContentPresenter" Property="TextBlock.Foreground" Value="{StaticResource StyleForeColorBrush}" />