我也无法让您的示例正常工作。我得出的结论是,如果您单击ListBoxItem
, IsFocused 属性将是False
为了ListBox
,因为这确实是ListBoxItem
那个有焦点。您将看到下面带注释的 XAML 样式试图达到您想要的效果,但没有成功。
我想评论的 XAMLwould如果您单击其中的某个位置,则可以工作ListBox
没有物品的地方(即非ListBoxItem
里面有空白ListBox
). Edit: 刚刚尝试过这个,由于某种原因也不起作用。
然而,真正有效的是为所有人创造一种风格ListBoxItem
内的物体ListBox
。那种风格基本都有EventSetters
这设置了BorderBrush
触发时适当地使用 MyListBox 的属性。
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;
}
希望这有一点帮助!
EDIT:我对原来的答案(上面)并不满意,因为我喜欢在 WPF 中编码时以声明方式执行操作(无代码隐藏)。我想出了一个解决方案,使用简单的彩色动画来触发GotFocus
and 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>
快乐编码!
EDIT 2:我查看了您更新的代码,并看到了您想要做什么(我认为)。我在以下位置找到了这个简洁的动画Lester 的 WPF 博客 http://blogs.msdn.com/llobo/archive/2006/08/31/Collapsing-animation-in-WPF.aspx。您可以尝试将其放入您的<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>