好的,我无法相信没有关于此的在线资源。我想做一件简单的事情,并在ListBox
项被选中时更改它的样式,而它的父ListBox
已失去焦点。
我们一直在使用VisualStateManager
用于此目的,但由于Selected
,SelectedFocused
和Focused
状态存在重叠,因此在选择项目时会引入一些错误以ctrl为例(选择了错误的项目)。我决定使用Trigger
修复它,发现当ListBox
失去焦点时似乎无法触发。
我的问题是实现此行为的正确方法是什么,请不要说“覆盖SystemColors”......
编辑:
好的,我已经投了两个答案但是选择了Viv的回答,因为他的回答使它与原版ListBox
完全一样,而我没有鼠标悬停和我已经使用的其他样式的问题。我已经看到Selector
附加属性的使用,但从未尝试IsSelectionActive
,它就像一个魅力。我建议为这类问题寻找触发器,尽管VisualStateManager
在WPF中更新。我认为显然存在一些可以避免的重叠状态问题。
再次感谢Viv和Richard为我的问题提供了两种实现解决方案的方法。
答案 0 :(得分:5)
好的,我无法相信没有关于此的在线资源。我想做一个简单的事情,当它被选中时改变ListBox项的样式,它的父ListBox失去了焦点。
猜猜您正在寻找MultiTrigger
IsSelected=true
和Selector.IsSelectionActive=false
?
如下所示:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ListBox Margin="15">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Foreground"
Value="Blue" />
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected"
Value="true" />
<Condition Property="Selector.IsSelectionActive"
Value="false" />
</MultiTrigger.Conditions>
<Setter Property="Foreground"
Value="Red" />
</MultiTrigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
<ListBoxItem Content="A" />
<ListBoxItem Content="B" />
<ListBoxItem Content="C" />
</ListBox>
<ListBox Grid.Column="1"
Margin="15">
<ListBoxItem Content="A" />
<ListBoxItem Content="B" />
<ListBoxItem Content="C" />
</ListBox>
</Grid>
现在当左侧ListBox
中的某个项目被选中,然后如果实际的ListBox
失去焦点,则会得到一个红色的Foreground
:
Foreground
只是一个示例,使用MultiTrigger
您可以根据需要调整Style
。
答案 1 :(得分:3)
以下是使用Style
的{{1}}的{{1}}。它以我期望的方式突出显示项目。
ListBoxItem