与样式一样,我们可以通过在ControlTemplate元素上设置TargetType属性来避免在模板绑定属性名称前加上类前缀:
Content Presenters 内容展示器
内容展示器是 WPF 等同于“您的内容”,它允许在运行时插入由ContentControl持有的内容。
将Padding从按钮内部映射到内容呈现器 Margin外部
就像Padding和Margin之间的映射一样,构建为您提供所需外观的元素并从模板化父级绑定适当
的属性将是创建您自己的控件模板的大量工作。
Template Triggers 模板触发器
Name="rect" /> Repurposing an existing property 扩展模板 在构建控件模板时,通常情况下您想要公开的变量多于被“模板化”的控件上的属性 Name="rect" /> Value="{Binding Path=Tag,RelativeSource={RelativeSource TemplatedParent}}"> 当IsMouseOver属性为True时,控件模板的触发器使用Tag属性的值。请注意,我们使用普通绑定(使用TemplatedParent RelativeSource)而不是模板绑定,因为普通绑定对象在运行时支持强制转 换,而模板绑定在编译时静态检查类型。正常绑定的使用使我们能够从对象类型的Tag属性中拉出BitmapEffect 。 当我们使用这种样式创建一个按钮时, Tag值充当默认值,我们可以用任何满足我们想象的位图效果来覆盖它(如示例 9‑6 中的中间按钮所示)。 请记住,控件的工作是提供行为。控件模板提供视觉效果。控件可以提供一组默认的视觉效果,但它应该允许替换这些视觉效果,以便提供与内置控件相同的灵活性。如果您需要同时提供自定义行为 和自定义视觉效果,请构建两个组件:一个控件和一个设计用于合并到控件模板中的元素。符合这种 当然,控件不可能完全独立于其视觉效果。如果控件要正确运行,任何控件都会强加一些模板必须满足的要求。这些要求的范围因控制而异。 任何控件类型与样式或模板之间都存在隐含的契约。 控件允许通过替换可视化树来自定义其外观,但树必须反过来代表控件提供某些功能。 以下部分描述了控件与其模板相关的各种方式。