不专心的ListBox,项目样式

Dej*_*vic 2 c# wpf styles listbox focus

好的,我无法相信没有关于此的在线资源.我想做一件简单的事情,并在ListBox项目被选中时更改项目的样式,并且它的父项ListBox已失去焦点.

我们一直在使用VisualStateManager用于这一目的,但由于有重叠的Selected,SelectedFocusedFocused指出,有选择持有例如CTRL项目时介绍了一些bug(错误项显示为被选中).我决定用Triggers 修复它,发现当ListBox失去焦点时似乎无法触发.

我的问题是实现这种行为的正确方法是什么,请不要说 "覆盖SystemColors"......

编辑:

好吧,我已经投了两个答案但是选择了Viv的回答,因为他的答案使它的工作方式与原版完全相同,ListBox而我没有鼠标悬停和我已经使用的其他样式的问题.我已经看过附属物的使用Selector,但从未尝试过IsSelectionActive,它就像一个魅力.我建议为这类问题寻找触发器,尽管VisualStateManager在WPF中更新.我认为显然存在一些可以避免的重叠状态问题.

再次感谢Viv和Richard为我的问题提供了两种实现解决方案的方法.

Viv*_*Viv 5

好的,我无法相信没有关于此的在线资源.我想做一个简单的事情,当它被选中时改变ListBox项的样式,它的父ListBox失去了焦点.

猜您寻找MultiTriggerIsSelected=trueSelector.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>
Run Code Online (Sandbox Code Playgroud)

现在当ListBox选择左侧的项目然后如果实际ListBox失去焦点时,它会得到一个红色,Foreground如:

在此输入图像描述

Foreground只是一个例子,使用MultiTrigger你可以调整Style你认为合适的.