如何在ListBox中更改SelectedItem的前景?

时间:2014-03-03 08:26:09

标签: wpf xaml listbox

昨天我问了这个问题,得到了一个很快的答案。但是现在我有一些不同的地方,最后一个解决方案不起作用。

首先让我们来看看我的xaml:

<ListBox ItemsSource="{Binding Children}" x:Name="lst">

    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True" Orientation="Vertical" MaxHeight="{Binding ElementName=lst, Path=ActualHeight}"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

    <ListBox.Resources>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Width" Value="250" />
            <Setter Property="Height" Value="125" />
            <Setter Property="Margin" Value="2.5" />
            <Setter Property="Padding" Value="2.5" />
            <Setter Property="Background" Value="{Binding Background, Converter={StaticResource stringToBrushConverter}}" />
            <Setter Property="Foreground" Value="White" />
            <Setter Property="VerticalContentAlignment" Value="Bottom" />
        </Style>
    </ListBox.Resources>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Height="125" Width="250">
                <Path Data="{Binding Image}"  VerticalAlignment="Center" 
                      Stretch="Uniform" Fill="#FFFFFFFF"
                      Width="68" Height="68" Margin="10" RenderTransformOrigin="0.5,0.5">
                    <Path.RenderTransform>
                        <TransformGroup>
                            <TransformGroup.Children>
                                <RotateTransform Angle="0" />
                                <ScaleTransform ScaleX="1" ScaleY="1" />
                            </TransformGroup.Children>
                        </TransformGroup>
                    </Path.RenderTransform>
                </Path>
                <TextBlock Text="{Binding Title, Converter={StaticResource spaceToNewLineConverter}}" VerticalAlignment="Top" 
                           Margin="40,10,10,10" FontSize="24" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>

</ListBox>

上面的xaml工作得非常好并且输出效果很好。但现在我想改变SelectedItem的前景色。

Here你可以找到我昨天问过的问题。

现在,昨天提出的问题的解决方案是这样的:

<Style x:Key="BlankListBoxContainerStyle" TargetType="{x:Type ListBoxItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>

   <Setter Property="FocusVisualStyle" Value="{x:Null} "/>
</Style>

如果我按上面的代码所示更改了模板,则会丢失我在列表框中应用的DataTemplate。

我还尝试SolidColorBrush并使用Setters and Triggers。但我运气不好。

2 个答案:

答案 0 :(得分:4)

您可以使用Style中的触发器来执行此操作。尝试这样的事情:

<ListBox.Resources>
    <Style TargetType="{x:Type ListBoxItem}">
        <Setter Property="Width" Value="250" />
        <Setter Property="Height" Value="125" />
        <Setter Property="Margin" Value="2.5" />
        <Setter Property="Padding" Value="2.5" />
        <Setter Property="Background" Value="{Binding Background, Converter={StaticResource stringToBrushConverter}}" />
        <Setter Property="Foreground" Value="White" />
        <Setter Property="VerticalContentAlignment" Value="Bottom" />
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Foreground" Value="Red" />
            </Trigger>
        </Style.Triggers>
    </Style>
</ListBox.Resources>

答案 1 :(得分:2)

在这种情况下,您需要在Foreground的DataTemplate中传递 ListBoxItem 值。这可以按如下方式完成:

<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal" 
                    Height="125" 
                    Width="250">
         ...
            <TextBlock Foreground="{Binding Path=Foreground,
                                            RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" ... />
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>