vik*_*iky 4 wpf triggers listbox focus
我想要打造我的风格ListBox
并展示Border
它.我想Border
在ListBox
获得焦点时隐藏它:
<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)
我也无法让你的例子正常工作.我得出的结论是,如果你单击a ListBoxItem
,那么IsFocused属性将会False
用于ListBox
,因为它确实ListBoxItem
是焦点.您将在下面看到注释的XAML样式,试图达到您想要的效果,但这不起作用.
我想如果你点击了没有项目的地方(即里面的非空白区域),评论的XAML 会起作用.编辑:试过这个,由于某种原因不起作用.ListBox
ListBoxItem
ListBox
但是,它的作用是为其中的所有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>
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中编码时做声明的事情(没有代码隐藏).我想出了一个解决方案,它使用简单的颜色动画来触发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>
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)
归档时间: |
|
查看次数: |
14013 次 |
最近记录: |