我想设置ListBox
的样式并在其周围显示Border
。我希望在Border
获得焦点时隐藏此ListBox
:
<Trigger Property="IsFocused" Value="True">
<Setter Property="Visibility" TargetName="border" Value="Collapsed"/>
</Trigger>
我在TextBox
中使用的同样的东西,它正常工作。
为什么Trigger
无效ListBox
?
修改
我Style
的{{1}}:
ListBox
答案 0 :(得分:5)
我也无法让你的例子正常工作。我得出结论,如果你点击ListBoxItem
,False
的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中编码时做声明的事情(没有代码隐藏)。我想出了一个使用简单颜色动画的解决方案,该动画会触发GotFocus
和LostFocus
路由事件。
这是:
<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>