首页 / 软件开发 / .NET编程技术 / 《Programming WPF》翻译 第9章 4.模板
《Programming WPF》翻译 第9章 4.模板2011-09-16 博客园 包建强对一个自定义元素最后的设计考虑是,它是如何连接其可视化的。如果一个元素直接从 FrameworkElement中派生,这将会适当的生成它自己的可视化。(第7章描述了如何创建一个图形外观。 )尤其是,如果你创建了一个元素,是为了提供一个特定的可视化表现,该元素应该完全控制这个可视化 是如何管理的,一旦你编写了一个控件,通常你不会将一个图形硬编码到里面。记住,一个控件的工作是提供行为。可视化是由控件模板提供的。这种可视化是由控件模板提供的。 一个控件可能提供一组默认的可视化,而应允许这些可视化被替换,为了提供像内迁控件一样的弹性。( 第五章描述了如何使用模板替换一个控件的可视化)符合这种方法的控件,这里可视化从控件中分离出来 ,通常引用到一个没有外观的控件。所有内迁到WPF的控件都是没有外观的。当然,控件完全独立于其可视化是不可能的。任何控件将对模板必须满足的需求施加影响,如果控件 操作正确。这些需求的程度随控件不同而不同。例如,Button有一个相当简单的需求——仅仅需要一个占 位符放置标题或内容。Slider控件需要更广泛的需求:可视化必须提供两个按钮(增加和减少), “Thumb”,以及运行时Thumb上的一个跟踪。此外,它还需要能够响应点击和拖动在这些元素的任意一个 ,以及能够定位这个Thumb。在任意控件类型和样式或模板之间有一个隐式的约定。这个控件允许它的外观通过替换可视化树的方 式进行自定义,但是这棵树必须轮流提供代表这棵树的某些特征。这个约定的本性依赖于这个控件,内嵌 控件使用一些不同的样式,紧紧依赖于它们的可视化结构。下面的部分描述了很多将控件与其模板联系在 一起的方式9.4.1属性别名控件和模板间最松散的约定形式是控件简单的定义了公有属性,以及允许模板来决定哪一个属性在别 名中可见。(参见第5章获取更多属性别名的信息。)这个控件并不关心在控件中是什么。这里有一个单行的约定:控件提供属性和命令,不需要返回值。尽管如此,如果必要的话,这样的控 件仍能响应用户输入。事件路由允许事件从可视化向上冒泡到控件。控件能够处理这些事件而不需要知道 任何关于可视化本性的信息。为了支持这个模型,你所要做的是,使用本章先前描述的依赖属性机制,来实现这些属性。示例9-11 显示了一个自定义控件,并且定义了一个单独的名为Foo的依赖属性,Brush类型。依赖属性支持这个控件的用户在模板中提及,正如示例9-12所示。示例9-12<ControlTemplate TargetType="{x:Type local:MyCustomControl}">
<Grid>
<Rectangle Fill="{TemplateBinding Foo}" />
</Grid>
</ControlTemplate>
所有的依赖属性自动支持属性别名。这种情形下的“约定”是由一组你的控件提供的依赖属性暗示的 。