WPF TemplateBinding vs语法进行分析将生成TemplatedParent
-
16-09-2019 - |
题
什么是的 差 这些2绑定:
<ControlTemplate TargetType="{x:Type Button}">
<Border BorderBrush="{TemplateBinding Property=Background}">
<ContentPresenter />
</Border>
</ControlTemplate>
和
<ControlTemplate TargetType="{x:Type Button}">
<Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}">
<ContentPresenter />
</Border>
</ControlTemplate>
?
解决方案
TemplateBinding是不太一样的东西。 MSDN文档通常是由具有考考您对软件功能的单音节随机微分方程人写的,所以细微之处不完全正确。
TemplateBindings在针对在控制模板中指定的类型编译时被评估。这允许编译模板更快实例。只是在一个摸索templatebinding的名字,你会看到,编译器会对其进行标记。
的结合标记是在运行时解决。而较慢的执行,绑定将解决不可见由模板声明的类型属性名称。通过比较慢,我会指出,它的种类,因为绑定操作相对需要很少的应用程序的CPU的。如果你在高速各地爆破控制模板,你可能会注意到它。
作为一个实践问题使用TemplateBinding时,你可以,但不要害怕绑定。
其他提示
TemplateBinding -更多的限制,比使用经常结合
- 比效率更高的结合,但它有更少的功能
- 只适用内部控件的视觉树
- 不会的工作性质上Freezables
- 不会的工作范围内的一个控件的触发
- 提供了一个快捷方式设定的性质(不作详细的),例如{TemplateBinding targetProperty}
定期 结合 -没有上述限制的TemplateBinding
- 尊重父性
- 重置目标的值来清除任何明确的设定值
- 例如:<Ellipse Fill="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Background}" />
还有一两件事 - TemplateBindings不允许值转换。它们不允许你通过一个转换器,并且不自动转换的int字符串例如(这是正常的绑定)。
TemplateBinding是用于与TemplatedParent绑定的简写,但它不暴露Binding类的所有功能,例如,你不能从TemplateBinding控制Binding.Mode。
的RelativeSource TemplatedParent
此模式允许在给定的ControlTemplate属性绑定到所述的ControlTemplate被施加到控制的一个属性。到很好了解这里的问题是波纹管
的示例<Window.Resources>
<ControlTemplate x:Key="template">
<Canvas>
<Canvas.RenderTransform>
<RotateTransform Angle="20"/>
</Canvas.RenderTransform>
<Ellipse Height="100" Width="150"
Fill="{Binding
RelativeSource={RelativeSource TemplatedParent},
Path=Background}">
</Ellipse>
<ContentPresenter Margin="35"
Content="{Binding RelativeSource={RelativeSource
TemplatedParent},Path=Content}"/>
</Canvas>
</ControlTemplate>
</Window.Resources>
<Canvas Name="Parent0">
<Button Margin="50"
Template="{StaticResource template}" Height="0"
Canvas.Left="0" Canvas.Top="0" Width="0">
<TextBlock FontSize="22">Click me</TextBlock>
</Button>
</Canvas>
如果我想给定控制的属性适用于它的控制模板然后我可以使用TemplatedParent模式。还有一个类似的这种标记扩展这是TemplateBinding这是一种在第一个的手短,但TemplateBinding是在编译时间这是刚刚在第一次运行时间后评价TemplatedParent的对比评估。正如可以在图中波纹管此话,背景和内容,从该按钮将控制模板内应用。
我想TemplateBinding不支持可冻结类型(包括刷对象)。为了解决这个问题。一个可利用的TemplatedParent
他们以同样的方式使用,但他们有一些区别。 下面是对TemplateBinding文档的链接: http://msdn.microsoft.com/en-us/library/ms742882。 ASPX