WPF基础之样式设置和模板化(二)
2009-05-02 23:48
387 查看
实质上,上面示例的 DataTemplate 确定只要存在 Photo 对象,该对象就应作为 Image 显示在 Border 中。通过此 DataTemplate,应用程序现在的外观如下:
数据模板化模型还提供其他功能。例如,如果要使用 HeaderedItemsControl 类型(如 Menu 或 TreeView)显示包含其他集合的集合数据,则可以使用 HierarchicalDataTemplate。另一个数据模板化功能是 DataTemplateSelector,利用这一功能可以根据自定义逻辑选择要使用的 DataTemplate。有关更多信息,请参见数据模板概述,该概述对不同的数据模板化功能进行了更加深入的讨论。
控件模板
请注意,我们的照片显示为图片,我们要水平显示这些照片,而不是垂直显示;我们希望 ListBox 是水平的。
不使用 ControlTemplate
首先,要使 ListBox 水平,不一定要使用 ControlTemplate,明确这一点很重要。ListBox 具有 ItemsPanel 属性,利用该属性可以设置 ItemsPanelTemplate,即控制 ListBox 的项的布局的模板。一种方法是只创建 ListBox 样式,然后设置 ItemsPanel 属性,如下例所示:
例表明,除了替换 ControlTemplate 之外,可能还有其他方法,这取决于具体的情况。在本示例中,如果希望获得具有其他属性(如圆角)的水平 ListBox,则需要使用 ListBox 的 ControlTemplate。
在提供示例来演示具体操作之前,首先需要说明 ControlTemplate 的概念。
什么是 ControlTemplate?
大多数控件都具有外观和行为。以按钮为例:外观是可以按下的凸起区域,行为是在响应单击时所引发的 Click 事件。
有时,控件可以提供所需行为,但不具有所需外观。到目前为止,我们已经演示了可以使用样式 setter 来设置属性值,从而影响控件的外观。但是,若要更改控件的结构,或对组成控件的组件设置属性值,就需要使用 ControlTemplate。
在 WPF 中,控件的 ControlTemplate 定义控件的外观。通过为控件定义新的 ControlTemplate 可以更改控件的结构和外观。很多情况下,这种方法都足够灵活,您不需要自己编写自定义控件。如果没有为控件定义自己的 ControlTemplate,则可以获取与系统主题匹配的默认模板,该模板向 Button 控件提供默认外观。
请注意:一旦为控件创建 ControlTemplate,就会替换整个 ControlTemplate。例如,可以通过以下方式定义 Button ControlTemplate。
请注意,ContentPresenter 元素只标记 Button 的 Content 应出现在何处。后面有一节专门展开详细讨论。
应用此模板之后,Button 显示为 Ellipse:
请记住,当 Button 具有焦点或按下时,其外观都是将替换的按钮的默认外观的组成部分。因此,您可能希望定义按钮按下时的外观,这取决于您的具体需要。
如果要创建 ControlTemplate,使用 ControlTemplate 示例 是最好的入门方法。如果确实需要查看控件的组成部分,可以查看位于主题的主题文件,也可以使用 XAMLPad(随 Windows 软件开发工具包 (SDK) 安装的应用程序)的 Show Visual Tree 功能。
创建 ControlTemplate
现在,继续演示示例,我们创建一个 ControlTemplate,它定义一个水平的圆角 ListBox。若要替换控件的 ControlTemplate,请将 Template 属性设置为新的 ControlTemplate。
以这种方式设置 Template 属性,实际上与使用 Style 设置其他控件属性没有区别:您将 Style 用作一个工具来帮助设置 Template 属性。也就是说,设置 ControlTemplate 的另一种方法是直接设置控件的 Template 属性。如果以这种方式设置,则会在 Resources 节中创建一个 ControlTemplate,并为它提供 x:Key,然后将它作为静态资源使用。
如上例所示,ControlTemplate 类具有 TargetType 属性,该属性类似于 Style 类的 TargetType 属性。但要注意,与 Style 和 DataTemplate 不同,ControlTemplate 对象没有隐式键的概念。换言之,如果有一个独立 ControlTemplate,其 TargetType 属性设置为某个类型,则 ControlTemplate 不会自动应用于该类型。另请注意,如果模板定义包含 ContentPresenter,则 ControlTemplate 需要 TargetType 属性。
尝试使用 ControlTemplate。例如,用 WrapPanel 替换 StackPanel,将 ScrollViewer 的 HorizontalScrollBarVisibility 属性设置为 Disabled,然后将 ListBox 的宽度设置为 300。(只有第一行空间不足时,WrapPanel 才会将项放置到下一行。如果没有将 ScrollViewer 的 HorizontalScrollBarVisibility 属性设置为 Disabled,由于可以滚动到末尾,则第一行不会空间不足。因此,WrapPanel 不会对项进行换行。)
数据模板化模型还提供其他功能。例如,如果要使用 HeaderedItemsControl 类型(如 Menu 或 TreeView)显示包含其他集合的集合数据,则可以使用 HierarchicalDataTemplate。另一个数据模板化功能是 DataTemplateSelector,利用这一功能可以根据自定义逻辑选择要使用的 DataTemplate。有关更多信息,请参见数据模板概述,该概述对不同的数据模板化功能进行了更加深入的讨论。
控件模板
请注意,我们的照片显示为图片,我们要水平显示这些照片,而不是垂直显示;我们希望 ListBox 是水平的。
不使用 ControlTemplate
首先,要使 ListBox 水平,不一定要使用 ControlTemplate,明确这一点很重要。ListBox 具有 ItemsPanel 属性,利用该属性可以设置 ItemsPanelTemplate,即控制 ListBox 的项的布局的模板。一种方法是只创建 ListBox 样式,然后设置 ItemsPanel 属性,如下例所示:
例表明,除了替换 ControlTemplate 之外,可能还有其他方法,这取决于具体的情况。在本示例中,如果希望获得具有其他属性(如圆角)的水平 ListBox,则需要使用 ListBox 的 ControlTemplate。
在提供示例来演示具体操作之前,首先需要说明 ControlTemplate 的概念。
什么是 ControlTemplate?
大多数控件都具有外观和行为。以按钮为例:外观是可以按下的凸起区域,行为是在响应单击时所引发的 Click 事件。
有时,控件可以提供所需行为,但不具有所需外观。到目前为止,我们已经演示了可以使用样式 setter 来设置属性值,从而影响控件的外观。但是,若要更改控件的结构,或对组成控件的组件设置属性值,就需要使用 ControlTemplate。
在 WPF 中,控件的 ControlTemplate 定义控件的外观。通过为控件定义新的 ControlTemplate 可以更改控件的结构和外观。很多情况下,这种方法都足够灵活,您不需要自己编写自定义控件。如果没有为控件定义自己的 ControlTemplate,则可以获取与系统主题匹配的默认模板,该模板向 Button 控件提供默认外观。
请注意:一旦为控件创建 ControlTemplate,就会替换整个 ControlTemplate。例如,可以通过以下方式定义 Button ControlTemplate。
请注意,ContentPresenter 元素只标记 Button 的 Content 应出现在何处。后面有一节专门展开详细讨论。
应用此模板之后,Button 显示为 Ellipse:
请记住,当 Button 具有焦点或按下时,其外观都是将替换的按钮的默认外观的组成部分。因此,您可能希望定义按钮按下时的外观,这取决于您的具体需要。
如果要创建 ControlTemplate,使用 ControlTemplate 示例 是最好的入门方法。如果确实需要查看控件的组成部分,可以查看位于主题的主题文件,也可以使用 XAMLPad(随 Windows 软件开发工具包 (SDK) 安装的应用程序)的 Show Visual Tree 功能。
创建 ControlTemplate
现在,继续演示示例,我们创建一个 ControlTemplate,它定义一个水平的圆角 ListBox。若要替换控件的 ControlTemplate,请将 Template 属性设置为新的 ControlTemplate。
以这种方式设置 Template 属性,实际上与使用 Style 设置其他控件属性没有区别:您将 Style 用作一个工具来帮助设置 Template 属性。也就是说,设置 ControlTemplate 的另一种方法是直接设置控件的 Template 属性。如果以这种方式设置,则会在 Resources 节中创建一个 ControlTemplate,并为它提供 x:Key,然后将它作为静态资源使用。
如上例所示,ControlTemplate 类具有 TargetType 属性,该属性类似于 Style 类的 TargetType 属性。但要注意,与 Style 和 DataTemplate 不同,ControlTemplate 对象没有隐式键的概念。换言之,如果有一个独立 ControlTemplate,其 TargetType 属性设置为某个类型,则 ControlTemplate 不会自动应用于该类型。另请注意,如果模板定义包含 ContentPresenter,则 ControlTemplate 需要 TargetType 属性。
尝试使用 ControlTemplate。例如,用 WrapPanel 替换 StackPanel,将 ScrollViewer 的 HorizontalScrollBarVisibility 属性设置为 Disabled,然后将 ListBox 的宽度设置为 300。(只有第一行空间不足时,WrapPanel 才会将项放置到下一行。如果没有将 ScrollViewer 的 HorizontalScrollBarVisibility 属性设置为 Disabled,由于可以滚动到末尾,则第一行不会空间不足。因此,WrapPanel 不会对项进行换行。)
相关文章推荐
- WPF基础之样式设置和模板化
- WPF基础之样式设置和模板化(一)
- WPF基础之样式设置和模板化(三)
- WPF入门(二)-样式设置和模板化
- wpf中给控件设置样式的三种方式
- css基础 设置所有h1标签的 文本颜色 对齐方式 边框样式 背景颜色
- WPF 样式和资源 给某个元素设置Style样式
- WPF后台动态添加TabItem并设置样式
- 继续聊WPF——为ListView的行设置样式
- C1 WPF C1FlexGrid设置样式技巧:单元格设置背景色
- WPF中RichTextBox设置文本的样式
- 潘鹏整理WPF(15)样式基础
- css基础 设置所有h1标签的 文本颜色 对齐方式 边框样式 背景颜色
- WPF按钮清空自带样式,以及透明按钮时,Grid的Background属性设置引起"点击"问题.
- WPF后台设置xaml控件的样式System.Windows.Style
- 【WPF】DataGrid的Row样式设置
- WPF:DataTemplateSelector设置控件不同的样式
- css基础 设置div 上下左右边框线的样式
- WPF 设置button样式,鼠标经过按钮字体变大
- WPF后台动态添加TabItem并设置样式