当前位置:网站首页>【WPF】Combobox默认样式学习笔记(Presenter和Trigger)
【WPF】Combobox默认样式学习笔记(Presenter和Trigger)
2022-08-06 20:57:00 【阿月浑子2021】
combobox中的一个ControlTemplate:
<ControlTemplate x:Key="ComboBoxTemplate" TargetType="{x:Type ComboBox}">
<Grid x:Name="templateRoot" SnapsToDevicePixels="true">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Width="0"/>
</Grid.ColumnDefinitions>
<Popup x:Name="PART_Popup" AllowsTransparency="true" Grid.ColumnSpan="2" IsOpen="{TemplateBinding IsDropDownOpen}" Margin="1" Placement="Bottom" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}">
<theme:SystemDropShadowChrome x:Name="shadow" Color="Transparent" MinWidth="{Binding ActualWidth, ElementName=templateRoot}" MaxHeight="{TemplateBinding MaxDropDownHeight}">
<Border x:Name="dropDownBorder" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1">
<ScrollViewer x:Name="DropDownScrollViewer">
<Grid x:Name="grid" RenderOptions.ClearTypeHint="Enabled">
<Canvas x:Name="canvas" HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
<Rectangle x:Name="opaqueRect" Fill="{Binding Background, ElementName=dropDownBorder}" Height="{Binding ActualHeight, ElementName=dropDownBorder}" Width="{Binding ActualWidth, ElementName=dropDownBorder}"/>
</Canvas>
<ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Grid>
</ScrollViewer>
</Border>
</theme:SystemDropShadowChrome>
</Popup>
<ToggleButton x:Name="toggleButton" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Grid.ColumnSpan="2"
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ComboBoxToggleButton}"/>
<ContentPresenter x:Name="contentPresenter" ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Content="{TemplateBinding SelectionBoxItem}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
IsHitTestVisible="false" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true">
<Setter Property="Margin" TargetName="shadow" Value="0,0,5,5"/>
<Setter Property="Color" TargetName="shadow" Value="#71000000"/>
</Trigger>
<Trigger Property="HasItems" Value="false">
<Setter Property="Height" TargetName="dropDownBorder" Value="95"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsGrouping" Value="true"/>
<Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
</MultiTrigger>
<Trigger Property="ScrollViewer.CanContentScroll" SourceName="DropDownScrollViewer" Value="false">
<Setter Property="Canvas.Top" TargetName="opaqueRect" Value="{Binding VerticalOffset, ElementName=DropDownScrollViewer}"/>
<Setter Property="Canvas.Left" TargetName="opaqueRect" Value="{Binding HorizontalOffset, ElementName=DropDownScrollViewer}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>1、ItemsPresenter和ContentPresenter的区别:
继承自ItemsControl 的控件人(如listbox),都有一个ItemsPanel 属性作为集合元素承载容器,但集合控件本身并不负责呈现控件,这个任务就留给了子元素ItemsPresenter,只要把它放在内部模板中,ItemsPresenter就会去检测父元素是否为集合控件,然后将ItemsPanel添加到其内部视觉树当中

ContentPresenter内容模板,默认显示文本,Content是object类型,可以修改ContentTemplate,丰富显示内容;数据源默认绑定,但可以通过指定ContentSource来绑定指定的源
ContentControl用于显示一个内容,它会拉伸(stretch)以填充其区域。一个 ItemsControl显示 多个 items ,但每个item仅占用它们需要的空间。
2、Trigger
MultiTrigger:比Trigger 多了一个Conditions 属性,用来存储条件,必须同时满足多个条件才会被触发
DataTrigger:基于数据执行某些判。DataTrigger的binding属性会把数据源源不断地送过来,一旦满足触发条件,datatrigger就会被触发
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self},Path=Text.Length}" Value="7">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>MultiDataTrigger:多数据条件触发,需要同时满足多个数据条件才会变化
<Style TargetType="ListBoxItem">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ID}" Width="60"/>
<TextBlock Text="{Binding Name}" Width="60"/>
<TextBlock Text="{Binding Age}" Width="60"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=ID}" Value="2"/>
<Condition Binding="{Binding Path=Name}" Value="Tim"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Background" Value="Orange"/>
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
</Style>EventTrigger:由事件触发,触发后执行一段动画而非setter。UI层的动画效果往往与EventTrigger相关联
<Style TargetType="Button">
<Style.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation To="150" Duration="0:0:2" Storyboard.TargetProperty="Width"/>
<DoubleAnimation To="150" Duration="0:0:2" Storyboard.TargetProperty="Height"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>边栏推荐
- y89. Chapter 5 Distributed Link Tracking System -- Deployment Skywalking and Skywalking Cases (3)
- STM32MP157A driver development | 03-usb host interface use (U disk)
- 2. 线性表的基本概念 + 基本操作
- 周末作业_登录注册
- JUC并发容器1(CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentSkip
- 一套次世代建模的流程是怎样的?
- ArcGIS Desktop 10.8软件安装包和安装教程
- es nested object区别
- 外贸独立站的运营效果到底如何
- [target detection] data enhancement: YOLO official data enhancement implementation / simple use of imgaug
猜你喜欢
随机推荐
使用软引用实现缓存机制
django 数据库 get_or_create函数update_or_create函数
我们来聊聊锁升级吧
Shell系统学习之文件操作
【无标题】camera2的相关介绍
如何运营外贸独立站
Edge Computing: Inventory 100 Knowledge Points
Servlet使用
Huawei Device User Access and Authentication Configuration Commands
centos8部署opengauss数据库和Navicat连接(超详细简单化)
LeetCode_695_岛屿的最大面积
初探基于OSG+OCC的CAD之Netgen体网格划分与显示
游戏建模师现状如何?10个建模师,有9个吃不上饭,是真的吗?
工单系统相关概念
ansible——playbook剧本概念及示例
distributed theory
多线程---进阶
Danger!Please replace BeanUtils in your code now!!!
STM32MP157A驱动开发 | 02-使用sdmmc接口读写sd卡(热插拔)
Unity API Details - GameObject Class









