首页 > 解决方案 > IsFocused 属性不适用于 WPF 中的 ListView?当我按 Tab 或单击 ListView 时,如何更改 ListView 的边框颜色?

问题描述

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

 <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>

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

标签: c#wpfxamlwpf-controlswpf-style

解决方案


您可以使用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>

推荐阅读