2

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

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

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

编辑:

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

再次感谢 Viv 和 Richard 提供了两种解决我的问题的方法的很好的例子。

4

2 回答 2

6

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

猜你在找一个MultiTriggerwith IsSelected=trueandSelector.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你认为合适的。

于 2013-07-10T14:11:51.653 回答
3

StyleListBoxItem使用VisualStateManager. 它以我期望的方式突出显示项目。

  <Style TargetType="ListBoxItem">
        <Setter Property="Foreground" Value="{DynamicResource ForegroundBrush}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Border x:Name="Border"
                            Background="Transparent"
                            CornerRadius="3"
                            BorderThickness="1"
                            Padding="2">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="SelectionStates">
                                <VisualState x:Name="Unselected"/>
                                <VisualState x:Name="Selected">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
                                                        Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
                                            <EasingColorKeyFrame KeyTime="0"
                                                                 Value="DodgerBlue"/>
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="SelectedUnfocused">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
                                                        Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
                                            <EasingColorKeyFrame KeyTime="0"
                                                                 Value="CornflowerBlue"/>
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <ContentPresenter/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
于 2013-07-10T13:34:40.920 回答