不专心的ListBox,项目样式

时间:2013-07-10 13:27:43

标签: c# wpf listbox styles focus

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

我们一直在使用VisualStateManager用于此目的,但由于SelectedSelectedFocusedFocused状态存在重叠,因此在选择项目时会引入一些错误以ctrl为例(选择了错误的项目)。我决定使用Trigger修复它,发现当ListBox失去焦点时似乎无法触发。

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

编辑:

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

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

2 个答案:

答案 0 :(得分:5)

  

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

猜猜您正在寻找MultiTrigger IsSelected=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>

现在当左侧ListBox中的某个项目被选中,然后如果实际的ListBox失去焦点,则会得到一个红色的Foreground

enter image description here

Foreground只是一个示例,使用MultiTrigger您可以根据需要调整Style

答案 1 :(得分:3)

以下是使用Style的{​​{1}}的{​​{1}}。它以我期望的方式突出显示项目。

ListBoxItem