我正在尝试更改列表框中所选项目的背景颜色。我之前使用
做到了<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Yellow" />
哪个有效。但是如果我在ListBox上将IsEnabled设置为false,则ListBox的整个背景将变为ControlBrush的指定颜色。如果选择了ListBoxItem并且ListBox没有焦点,我只想更改颜色。
我尝试了一些带触发器的品种,但我无法让它发挥作用。即使是包含IsSelected和IsFocused条件的多重触发器也不适用于我。
有没有人为我提供解决方案?
修改 尝试使用ItemContainerStyle的示例,我在项目中得到NullReferenceException。它在新的解决方案中有效。这是不起作用的代码:
<ItemsControl ItemsSource="{Binding Path=Classification.Values}" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsEnabled="{Binding Path=ClassificationEnabled}"
VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" Grid.Row="0" x:Name="measureClassificationControl">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="2">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Text="{Binding Category}"/>
<ListBox ItemsSource="{Binding Values.SortedList}" SelectionMode="Extended" Grid.Row="1" AlternationCount="2"
SelectionChanged="ListBox_SelectionChanged" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Height="120">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock TextWrapping="NoWrap" Text="{Binding Key}">
<TextBlock.ToolTip>
<ToolTip>
<TextBlock TextWrapping="NoWrap" Text="{Binding Value}"/>
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="2"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
答案 0 :(得分:1)
将SystemColors.ControlBrushKey
添加到ItemContainerStyle
。这样它只会影响所选项目。
编辑:这是一个完整的Xaml示例。
<StackPanel>
<ListBox IsEnabled="{Binding ElementName=enabledButton, Path=IsChecked}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
Color="Yellow" />
</Style.Resources>
</Style>
</ListBox.ItemContainerStyle>
<ListBoxItem>Item 1</ListBoxItem>
<ListBoxItem>Item 2</ListBoxItem>
<ListBoxItem>Item 3</ListBoxItem>
<ListBoxItem>Item 4</ListBoxItem>
<ListBoxItem>Item 5</ListBoxItem>
</ListBox>
<ToggleButton Name="enabledButton" IsChecked="True" Content="IsEnabled"/>
</StackPanel>
答案 1 :(得分:0)
您不能同时拥有IsSelected
True
和IsEnabled
False
。另外IsFocused
True
和IsEnabled
False
。
您的问题将IsSelected
的{{1}}和True
的背景颜色更改称为False。
在下面的代码中(只需在你的窗口代码中粘贴IsFocused
XAML)......所有这些状态组合都已实现...要检查某些内容是否已聚焦但未选中,您必须选择某行然后使用“Control +向上/向下箭头键”从所选行中失去焦点并聚焦其他未选择的行。
您还会发现所选行背景的ListBox
颜色不会显示(Orange
颜色Foreground
可以正常工作)。对于该背景颜色更改,您必须覆盖ListBoxItem的template。
Cyan
我希望这能指导你正确的方向。
答案 2 :(得分:0)
现在解决了这个问题。问题似乎是当系统颜色被多次覆盖时XamlParser不喜欢它。所以我把它定义为:
<Window x:Class="DataGridTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit" xmlns:DataGridTest="clr-namespace:DataGridTest"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<DataGridTest:VM />
</Window.DataContext>
<StackPanel>
<ItemsControl ItemsSource="{Binding Values}">
<ItemsControl.Resources>
<Style TargetType="ListBoxItem">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
Color="Yellow" />
</Style.Resources>
</Style>
</ItemsControl.Resources>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ListBox IsEnabled="{Binding ElementName=enabledButton, Path=IsChecked}">
<ListBoxItem>Item 1</ListBoxItem>
<ListBoxItem>Item 2</ListBoxItem>
<ListBoxItem>Item 3</ListBoxItem>
<ListBoxItem>Item 4</ListBoxItem>
<ListBoxItem>Item 5</ListBoxItem>
</ListBox>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ToggleButton Name="enabledButton" IsChecked="True" Content="IsEnabled"/>
</StackPanel>
</Window>
感谢您的帮助!