ControlTemplate & DataTemplate

ControlTemplate和DataTemplate都是用于定制控件的外观,但两者有着很大的区别。

ControlTemplate服务于Control(有形的控件),而DataTemplate服务于Data(无形的数据)。

换句话说,ControlTemplate用于将已有的外观进行改造,DataTemplate是从无到有地构建外观。

 

ContentControl、ItemsControl类型

  • ContentControl,它的Content属性包含单个元素,例如Button
  • ItemsControl,它的Items属性包含多个元素,例如Listbox

 

ContentPresenter、ItemsPresenter类型

平常的使用中,可以认为这些Presenter是占位符,用于ControlTemplate的定义中,代表了控件原本的Content。

以ContentControl为例,它有一个ContentPresenter类型的属性,如果其值是一个UIElement,那就直接显示这个UIElement,但如果是某个无形的数据,就要让ContentPresenter的值是一个DataTemplate。

 

ControlTemplate类型

ControlTemplate的代表:

  • ContentControl类型的Template属性
  • ItemsControl类型的Template属性

ControlTemplate类型中常见到{TemplateBinding 属性名},一般表示与原有控件的属性绑定。

 

DataTemplate类型

DataTemplate的典型代表:

  • ContentControl类型的ContentTemplate属性
  • ItemsControl类型的ItemTemplate属性

DataTemplate类型中常见到{Binding …},表示数据绑定。

 

 

以下不属于Template,但是经常会与Template一起出现,所以写在这里。

 

ItemsPanel类型

表示ItemsControl各个Item是如何布局的,常用的也就是StackPanel横过来竖过来这些。

 

ItemContainerStyle类型

定制ItemsControl中各个Item的Style。如果要定制ItemsControl总框架的Style,就直接用ItemsControl的Style属性。

 

我的体会

DataTemplate比ControlTemplate更常用。

了解一个控件的Template(ControlTemplate类型),需要用blend查看控件的VisualTree,查起来改起来都比较麻烦。但有些情况下用ControlTemplate很有效率,例如把所有的TextBox都换成圆角的、给button改个形状加个图片。对于伤筋动骨的改造,需要ControlTemplate,而对于一般的描眉画眼(给现有的属性赋新值),只需要在Style的Setter里给要改变的属性赋值就可以了。

转载于:https://www.cnblogs.com/dc10101/archive/2011/12/08/2280117.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 `DataGrid.RowStyle` 来为每行设置样式,并在第二行及以后的行中添加 `MouseBinding`,如下所示: ``` <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type DataGridRow}"> <Border x:Name="DGR_Border" BorderThickness="1" BorderBrush="#E0E0E0" Margin="0,-1,0,0"> <SelectiveScrollingGrid> <SelectiveScrollingGrid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </SelectiveScrollingGrid.ColumnDefinitions> <SelectiveScrollingGrid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> </SelectiveScrollingGrid.RowDefinitions> <DataGridCellsPresenter SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Grid.Column="1" x:Name="CellPresenter"/> <DataGridDetailsPresenter SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Grid.Column="1" Grid.Row="1" x:Name="DetailsPresenter"/> <DataGridRowHeader Grid.RowSpan="2" SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" x:Name="RowHeader"/> </SelectiveScrollingGrid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter TargetName="DGR_Border" Property="Background" Value="#FFC5CBF9"/> </Trigger> <DataTrigger Binding="{Binding Cad_No}" Value="YOUR_VALUE_HERE"> <Setter TargetName="DTCB" Property="IsEnabled" Value="False"/> </DataTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> <Style.Triggers> <Trigger Property="AlternationIndex" Value="1"> <Setter Property="Background" Value="#FAFAFA"/> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="#F2F2F2"/> </Trigger> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="#FFC5CBF9"/> </Trigger> </Style.Triggers> </Style> </DataGrid.RowStyle> ``` 在模板中,你需要使用 `ControlTemplate.Triggers` 来添加样式触发器。在这个例子中,我添加了一个数据触发器,当 `Cad_No` 的值等于你指定的值时,禁用 `CheckBox`。你需要将 `YOUR_VALUE_HERE` 替换为你想要使用的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值