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

时间:2009-11-18 05:19:40

标签: wpf triggers listbox focus

我想设置ListBox的样式并在其周围显示Border。我希望在Border获得焦点时隐藏此ListBox

<Trigger Property="IsFocused" Value="True">
    <Setter Property="Visibility" TargetName="border" Value="Collapsed"/>
</Trigger>

我在TextBox中使用的同样的东西,它正常工作。 为什么Trigger无效ListBox

修改

Style的{​​{1}}:

ListBox

3 个答案:

答案 0 :(得分:5)

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

如果您点击ListBox内没有任何项目的地方(即ListBoxItem内的非ListBox空格,我会想到注释的XAML 有效{1}})。 修改 刚试过这个,由于某种原因无效。

但是,有效的是为ListBoxItem中的所有ListBox个对象创建样式。该样式基本上具有EventSetters,可以在触发时适当地设置MyListBox的BorderBrush属性。

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>

代码隐藏:

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

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

希望这有点帮助!

修改 我对原始答案(上图)不满意,因为我喜欢在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>

快乐的编码!

编辑2: 我查看了你的更新代码,看到了你想要做的事情(我想)。我在Lester's WPF Blog找到了这个整洁的动画。您可以尝试将其放入<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>

答案 1 :(得分:0)

对于ListBox IsFocused不更新,因为焦点不会进入列表框但是它进入listbox所覆盖的区域意味着包含ListBoxItems的ItemsPresenter。我有一个解决这个问题的方法。 在ListBox的MouseDown事件处理程序中,我调用了Focus()方法。它将IsFocused属性设置为true并使我的触发器工作。

答案 2 :(得分:0)

试试这个,它有效。

    <Style.Triggers>
        <EventTrigger RoutedEvent="Control.GotFocus">
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation Storyboard.TargetProperty="Background.Color" To="Orange" Duration="0:0:0.250"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="Control.LostFocus">
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation Storyboard.TargetProperty="Background.Color" To="White" Duration="0:0:0.250"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Style.Triggers>