WPF ListBox触发器不适用于IsFocused属性

vik*_*iky 4 wpf triggers listbox focus

我想要打造我的风格ListBox并展示Border它.我想BorderListBox获得焦点时隐藏它:

<Trigger Property="IsFocused" Value="True">
    <Setter Property="Visibility" TargetName="border" Value="Collapsed"/>
</Trigger>
Run Code Online (Sandbox Code Playgroud)

同样我正在使用TextBox它并且它正常工作.为什么这Trigger不起作用ListBox

编辑:

Style为我这个ListBox:

<ControlTemplate TargetType="{x:Type local:ListBox}">
    <Border SnapsToDevicePixels="true" x:Name="Bd" CornerRadius="5"
            Background="{TemplateBinding Background}"
            BorderBrush="{TemplateBinding BorderBrush}"
            BorderThickness="{TemplateBinding BorderThickness}" Padding="1">
        <Grid>
            <local:ScrollViewer Focusable="false" Padding="{TemplateBinding Padding}">
                <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
            </local:ScrollViewer>
            <Border CornerRadius="5" Background="Red" x:Name="border">
                <TextBlock VerticalAlignment="Center" FontWeight="Bold" Foreground="White"
                           Text="{TemplateBinding Message}" FontFamily="Courier New" />
            </Border>
        </Grid>
    </Border>
</DockPanel>
    <ControlTemplate.Triggers>
        <Trigger Property="IsFocused" Value="True">
            <Setter Property="Visibility" TargetName="border" Value="Collapsed"/>
        </Trigger>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Background" TargetName="Bd"
                    Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
        </Trigger>
        <Trigger Property="IsGrouping" Value="true">
            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

Mar*_*ter 5

我也无法让你的例子正常工作.我得出的结论是,如果你单击a ListBoxItem,那么IsFocused属性将会False用于ListBox,因为它确实ListBoxItem是焦点.您将在下面看到注释的XAML样式,试图达到您想要的效果,但这不起作用.

我想如果你点击了没有项目的地方(即里面的非空白区域),评论的XAML 起作用.编辑:试过这个,由于某种原因不起作用.ListBoxListBoxItemListBox

但是,它的作用是为其中的所有ListBoxItem对象创建一种样式ListBox.该样式基本上具有在触发时适当EventSetters设置BorderBrushMyListBox 的属性.

XAML:

<ListBox Name="MyListBox" DockPanel.Dock="Top" BorderThickness="2">
    <!--<ListBox.Style>
        <Style TargetType="{x:Type ListBox}">
            <Style.Triggers>
                <Trigger Property="IsFocused" Value="True">
                    <Setter Property="BorderBrush" Value="Red"/>
                    <Setter Property="BorderThickness" Value="2"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.Style>-->
    <ListBox.Resources>
        <Style TargetType="{x:Type ListBoxItem}">
            <EventSetter Event="GotFocus" Handler="ListBoxItem_GotFocus"/>
            <EventSetter Event="LostFocus" Handler="ListBoxItem_LostFocus"/>
        </Style>
    </ListBox.Resources>
    <ListBoxItem>Item 1</ListBoxItem>
    <ListBoxItem>Item 2</ListBoxItem>
    <ListBoxItem>Item 3</ListBoxItem>
    <ListBoxItem>Item 4</ListBoxItem>
</ListBox>
Run Code Online (Sandbox Code Playgroud)

代码隐藏:

private void ListBoxItem_GotFocus(object sender, RoutedEventArgs e) {
    MyListBox.BorderBrush = Brushes.Red;
}

private void ListBoxItem_LostFocus(object sender, RoutedEventArgs e) {
    MyListBox.BorderBrush = Brushes.Black;
}
Run Code Online (Sandbox Code Playgroud)

希望这有点帮助!

编辑: 我对我的原始答案(上图)不满意,因为我喜欢在WPF中编码时做声明的事情(没有代码隐藏).我想出了一个解决方案,它使用简单的颜色动画来触发GotFocusLostFocus路由事件.

这里是:

<ListBox Name="MyListBox" DockPanel.Dock="Top" BorderThickness="2" Height="200">
        <ListBox.BorderBrush>
            <SolidColorBrush Color="Black"/>
        </ListBox.BorderBrush>
        <ListBox.Style>
            <Style TargetType="{x:Type ListBox}">
                <Style.Resources>
                    <Storyboard x:Key="FadeBlack">
                        <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" 
                                        To="Black" Duration="0:0:0.1"/>
                    </Storyboard>
                    <Storyboard x:Key="FadeRed">
                        <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" 
                                        To="Red" Duration="0:0:0.1"/>
                    </Storyboard>
                </Style.Resources>
                <Style.Triggers>
                    <EventTrigger RoutedEvent="GotFocus">
                        <BeginStoryboard Storyboard="{StaticResource FadeRed}"/>
                    </EventTrigger>
                    <EventTrigger RoutedEvent="LostFocus">
                        <BeginStoryboard Storyboard="{StaticResource FadeBlack}"/>
                    </EventTrigger>
                </Style.Triggers>
            </Style>
        </ListBox.Style>
        <ListBoxItem>Item 1</ListBoxItem>
        <ListBoxItem>Item 2</ListBoxItem>
        <ListBoxItem>Item 3</ListBoxItem>
        <ListBoxItem>Item 4</ListBoxItem>
    </ListBox>
Run Code Online (Sandbox Code Playgroud)

快乐的编码!

编辑2: 我查看了你的更新代码,看到了你想要做的事情(我想).我在Lester的WPF博客上找到了这个动画片.您可以尝试将其放入您的<ControlTemplate.Triggers>收藏中:

<EventTrigger RoutedEvent="ListBox.GotFocus">
    <BeginStoryboard>
        <Storyboard>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="border">
                    <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Collapsed}" />
            </ObjectAnimationUsingKeyFrames>
        </Storyboard>
    </BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="ListBox.LostFocus">
    <BeginStoryboard>
        <Storyboard>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="border">
                <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}" />
            </ObjectAnimationUsingKeyFrames>
        </Storyboard>
    </BeginStoryboard>
</EventTrigger>
Run Code Online (Sandbox Code Playgroud)