IsFocused 属性 不适用于 WPF 中的 ListView?当我按下 Tab 键或单击 ListView 时,如何更改 ListView 的边框颜色?

The IsFocused property does not work for ListView in WPF? How can i change the border color of ListView when i press tab or click on the ListView?

我正在设计一个 ListView,我想在它获得焦点时更改它的边框颜色,IsFocused 属性 似乎不适用于 ListView。有没有类似 IsFocused for Listview 的属性?

 <Style x:Key="{x:Type ListView}" TargetType="ListView">
        <Setter Property="SnapsToDevicePixels" Value="True" />
        <Setter Property="OverridesDefaultStyle" Value="True" />
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
        <Setter Property="ScrollViewer.CanContentScroll" Value="True" />
        <Setter Property="VerticalContentAlignment" Value="Center" />
        <Setter Property="BorderBrush" Value="{StaticResource EnabledListViewBorder}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListView}">
                    <Border x:Name="Border"
                            Background="Transparent"
                            Padding="{TemplateBinding Padding}"
                            BorderBrush="{StaticResource EnabledListViewBorder}"
                            BorderThickness="1">
                        <ScrollViewer Style="{DynamicResource ListViewColumnHeaderScrollViewer}">
                            <ItemsPresenter />
                        </ScrollViewer>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsGrouping" Value="True">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="False" />
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DiabledListViewBorder}" />
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DiabledListViewBorder}" />
                        </Trigger>                      
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <EventTrigger RoutedEvent="GotFocus">
                <BeginStoryboard>
                    <Storyboard Duration="0:0:0:1" AutoReverse="False">
                        <ColorAnimation
                            Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"
                            FillBehavior="HoldEnd" From="Red" To="Red"/>                        
                    </Storyboard>                    
                </BeginStoryboard>                
            </EventTrigger>
            <EventTrigger RoutedEvent="LostFocus">
                <BeginStoryboard>
                    <Storyboard AutoReverse="False" Duration="0:0:0:1">
                        <ColorAnimation
                            Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"
                            FillBehavior="HoldEnd" From="Green" To="Green"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>

我已经使用提供的解决方案更新了我的源代码中的问题,但边框颜色没有改变。我在这里错过了什么。

对于 ListBox IsFocused 不起作用,因为焦点转到包含 ListBoxItems 的 ItemsPresenter。因此,将焦点转到列表框内的 ItemsPresenter。我得到了解决方法,您订阅事件 MouseDown 并在其中为 ListView 执行 Focus,然后触发器开始工作。

让我知道它是否适合你

您可以使用 Style.Triggers 来处理 GotFocusLostFocus 事件。

<ListView.Style>
    <Style TargetType="ListView">
        <Style.Triggers>
            <EventTrigger RoutedEvent="GotFocus">
                <BeginStoryboard>
                    <Storyboard Duration="0:0:0:1" AutoReverse="False">
                        <ColorAnimation 
                        Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" 
                        FillBehavior="HoldEnd" From="Red" To="Red"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
            <EventTrigger RoutedEvent="LostFocus">
                <BeginStoryboard>
                    <Storyboard AutoReverse="False" Duration="0:0:0:1">
                        <ColorAnimation 
                        Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" 
                        FillBehavior="HoldEnd" From="Green" To="Green" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>
</ListView.Style>

更新:
如果您重写了 ControlTemplate,则删除 Style.Triggers 部分并将 EventTriggers 从它移至 ControlTemplate.Triggers。此外,您必须设置 Storyboard.TargetName="Border".

<EventTrigger RoutedEvent="LostFocus">
    <BeginStoryboard>
        <Storyboard AutoReverse="False" Duration="0:0:0:1" Storyboard.TargetName="Border" >
            <ColorAnimation
Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" 
FillBehavior="HoldEnd" From="Green" To="Green" />
        </Storyboard>
    </BeginStoryboard>
</EventTrigger>