ControlTemplate

  1. ControlTemplate:用于定义控件的结构和外观,这样可以将控件外观与控件功能分离开. 在xaml中ControlTemplate通常配置到Style中,通过Style控制控件的结构和外观
  2. 如果控件继承自ContentControl类,其模板将包含一个ContentPresenter类成员,ContentPresenter用于指定添加内容的位置,下面是一个Button Style,ContentPresenter的标记表明Button的Content应在Grid内垂直且水平居中显示
    ContentPresenter example<Style TargetType="Button">
    <!--Set to true to not get any properties from the themes.-->
    <Setter Property="OverridesDefaultStyle" Value="True"/>
    <Setter Property="Template">
    <Setter.Value>
    <ControlTemplate TargetType="Button">
    <Grid>
    <Ellipse Fill="{TemplateBinding Background}"/>
    <ContentPresenter HorizontalAlignment="Center"
    VerticalAlignment="Center"/>
    </Grid>
    </ControlTemplate>
    </Setter.Value>
    </Setter>
    </Style>
  3. ControlTemplate中也可以添加Trigger,当一个属性发生变化时用于控制一个或者多个属性的变化。如下代码,注意TargetName属性指定了control的名字,满足条件时就会修改该control的属性
    ControlTemplate example<ControlTemplate TargetType="ListBoxItem">
    <Border Name="ItemBorder" BorderThickness="1" Margin="1" Background="{StaticResource TransparentBrush}">
    <ContentPresenter />
    </Border>
    <ControlTemplate.Triggers>
    <Trigger Property="IsSelected" Value="True">
    <Setter TargetName="ItemBorder" Property="Background" Value="{StaticResource TransparentBrush}" />
    </Trigger>
    <Trigger Property="IsMouseOver" Value="True">
    <Setter TargetName="ItemBorder" Property="Background" Value="{StaticResource TransparentBrush}" />
    </Trigger>
    </ControlTemplate.Triggers>
    </ControlTemplate>
  4. 如果控件继承自ItemsControl类,其模板将包含一个ItemsPresenter元素,指示何处放置列表项的模板
  5. 模板绑定:通过使用模板绑定,模板可以从应用模板的控件提取一个值,ContentPresenter之所以能显示Content,就是因为它有一个隐式的模板绑定将ContentPresenter.Content设置为Button.Content,如下代码则设置button content的内边距,如果不把Margin通过TemplateBinding绑定到Padding属性,Button的content 会与侧边重合
    TemplateBinding example<ControlTemplate x:key="ButtonTemplate" TargetType="{x:Type Button}">
    <Border BorderBrush="Orange" BorderThickness="3" CornerRadius="2"
    Background="Red" TextBlock.Foreground="White">
    <ContentPresenter RecognizeAccessKey="True"
    Margin="{TemplateBinding Padding}">
    </ContentPresenter>
    </Border>
    </ControlTemplate>
  6. 模板与样式:两者都可以改变control的外观,但样式被限制在一定范围,它不能使用由不同子control组成的可视化数替换control的原有外观,如条目2中的椭圆形按钮,仅使用style无法实现.
  7. WPF编程宝典中提供的能查看每个control的Template的工具,关键代码如下:
    TemplateBinding exampleprivate void Window_Loaded(object sender, RoutedEventArgs e)
    {
    Type controlType = typeof(Control);
    List<Type> derivedTypes = new List<Type>();
    Assembly assembly = Assembly.GetAssembly(typeof(Control));
    foreach (Type type in assembly.GetTypes())
    {
    if (type.IsSubclassOf(controlType) && !type.IsAbstract && type.IsPublic)
    {
    derivedTypes.Add(type);
    }
    }
    derivedTypes.Sort(delegate(Type x, Type y)
    {
    return x.FullName.CompareTo(y.FullName);
    });
    lstTypes.ItemsSource = derivedTypes;
    }
    private void lstTypes_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
    try
    {
    Type type = (Type)lstTypes.SelectedItem;
    ConstructorInfo info = type.GetConstructor(Type.EmptyTypes);
    Control control = (Control)info.Invoke(null);
    control.Visibility = Visibility.Collapsed;
    grid.Children.Add(control);
    ControlTemplate template = control.Template;
    XmlWriterSettings setting = new XmlWriterSettings();
    setting.Indent = true;
    StringBuilder sb = new StringBuilder();
    XmlWriter writer = XmlWriter.Create(sb, setting);
    System.Windows.Markup.XamlWriter.Save(template, writer);
    txtTemplate.Text= sb.ToString();
    grid.Children.Remove(control);
    }
    catch (Exception ex)
    {
    txtTemplate.Text = string.Format("Error generating tempalte:{0}",ex);
    }
    }

DataTemplate


  1. DataTemplate支持对数据的表现形式进行自定义,它可以包含任何元素的组合,还应当包含一个或者多个数据绑定表达式,有两种类型的控件支持:
    • 内容控件,通过ContentTemplate属性支持数据模板,内容模板用于显示任何放在Content属性中的内容
    • 列表控件,继承自ItemsControl的控件,通过ItemTemplate属性支持数据模板,用于显示ItemsSource提供的集合中的每个项。也就是该模板会被用作列表中每个项的ContentTemplate模板,如对于ListBox控件,数据模板会作用与ListBoxItem元素,而对于ComboBox则会作用于ComboBoxItem元素
  2. DataTemplate支持使用 DataTemplate.DataType来确定使用模板的绑定数据的类型
  3. 使用下列技术可以使DataTemplate更灵活的表现数据
    • DataTrigger:可以根据绑定的数据对象中的属性值使用触发器修改模板中的属性

      DataTrigger example<DataTemplate x:Key="DefaultTemplate">
      <DataTemplate.Triggers>
      <DataTrigger Binding="{Binding Path=CategoryName}" Value="Tools">
      <Setter Property="ListBoxItem.Foreground" Value="Red"></Setter>
      </DataTrigger>
      </DataTemplate.Triggers>
      </DataTemplate>
    • 使用值转换器:实现了IValueConverter接口的类,能够将一个值从绑定的对象转换为可用于设置模板中与格式化相关的属性的值
      IValueConverter example<DataTemplate x:Key="DefaultTemplate">
      <Image Source="{Binding path=imagePath}" Converters="{StaticResource ImagePathConverter}" />
      </DataTemplate>
    • 使用模板选择器:模板选择器检查绑定的数据对象,并在几个不同的模板之间进行选择。需要继承DataTemplateSelector类,重写SelectTemplate函数。如下代码自定义的SingleHighlightTemplateSelector类包含连个数据模板,并根据属性的值在SelectTemplate函数中选择相应的数据模板
      DataTemplateSelector example<ListBox Name="lsProducts" HorizontalContentAlignment="Stretch">
      <ListBox.ItemTemplateSelector>
      <local:SingleHighlightTemplateSelector
      DefaultTemplate="{StaticResource DefaultTemplate}"
      HighlightTemplate="{StaticResource HighlighTemplate}"
      PropertyoEvaluate="CategoryName"
      PropertyValueToHighlight="Travel"></local:SingleHighlightTemplateSelector>
      </ListBox.ItemTemplateSelector>
      </ListBox>

WPF Template的更多相关文章

  1. WPF Template模版之DataTemplate与ControlTemplate【一】

    WPF Template模版之DataTemplate与ControlTemplate[一] 标签: Wpf模版 2015-04-19 11:52 510人阅读 评论(0) 收藏 举报  分类: -- ...

  2. WPF Template模版之寻找失落的控件【三】

    “井水不犯河水”常用来形容两个组织之间界限分明.互不相干,LogicTree与控件内部这颗小树之间就保持着这种关系.换句话说,如果UI元素树上有个X:Name=“TextBox1”的控件,某个控件内部 ...

  3. WPF Template模版之DataTemplate与ControlTemplate的关系和应用【二】

    1. DataTemplate和ControlTemplate的关系 学习过DataTemplate和ControlTemplate,你应该已经体会到,控件只是数据的行为和载体,是个抽象的概念,至于它 ...

  4. 【转】WPF Template模版之DataTemplate与ControlTemplate的关系和应用(二)

    1. DataTemplate和ControlTemplate的关系 学习过DataTemplate和ControlTemplate,你应该已经体会到,控件只是数据的行为和载体,是个抽象的概念,至于它 ...

  5. 【转】WPF Template模版之DataTemplate与ControlTemplate(一)

    WPF系统不但支持传统的Winfrom编程的用户界面和用户体验设计,更支持使用专门的设计工具Blend进行专业设计,同时还推出了以模板为核心的新一代设计理念. 1. 模板的内涵 作为表现形式,每个控件 ...

  6. wpf template的code写法

    this.Template = XamlReader.Load ("<ControlTemplate xmlns='http://schemas.microsoft.com/clien ...

  7. .NET: WPF Template

    Data Template: 要做一个listBox,里面有车子的简单信息,点了里面的item后就会显示详细信息. car class: using System; using System.Coll ...

  8. WPF:在ControlTemplate中使用TemplateBinding

    A bit on TemplateBinding and how to use it inside a ControlTemplate. Introductio Today I'll try to w ...

  9. WPF学习(10)模板

    在前面一篇我们粗略说了Style和Behaviors,如果要自定义一个个性十足的控件,仅仅用Style和Behaviors是不行的,Style和Behaviors只能通过控件的既有属性来简单改变外观, ...

随机推荐

  1. Java线程池原理与架构分析

    /** * 一.线程池:提供了一个线程队列,队列中保存着所有等待状态的线程.避免了创建与销毁额外开销,提高了响应速度 * 二.线程池的体系结构 * java.util.concurrent.Execu ...

  2. ubuntu下Chrome谷歌浏览器部分网站图片显示不正常的解决方法

    title: ubuntu下Chrome谷歌浏览器部分网站图片显示不正常的解决方法 toc: false date: 2018-09-02 14:37:26 categories: methods t ...

  3. Asp.Net Core部署到Linux服务器

    从2016年7月, .NET Core1.0 正式发布开始,由于时间问题,我没怎么关注过.NET Core,最近刚抽出点时间研究了下,先讲下如何把ASP.NET Core部署到Linux上吧.这里我用 ...

  4. Oracle学习系类篇(一)

    1.表空间介绍 oarcle数据库真正存放数据的是数据文件(data files),Oarcle表空间(tablespaces)实际上是一个逻辑的概念,他在物理上是并不存在的,那么把一组data fi ...

  5. Five Invaluable Techniques to Improve Regex Performance

    Regular expressions are powerful, but with great power comes great responsibility. Because of the wa ...

  6. Book 动态规划

    虽然之前学过一点点,但是还是不会------现在好好跟着白书1.4节学一下—————— (1)数字三角形 d(i,j) = max(d(i+1,j),d(i+1,j+1)) + a[i][j] hdu ...

  7. 【AnjularJS系列3 】 — 数据的双向绑定

    第三篇,双向的数据绑定 数据绑定是AnguarJS的特性之一,避免书写大量的初始代码从而节约开发时间 数据绑定指令提供了你的Model投射到view的方法.这些投射可以无缝的,毫不影响的应用到web应 ...

  8. Python内置数据结构之字典dict

    1. 字典 字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下.键可能是数(整数索引).字符串或元组.字典(日常生活中的字典和Python字典)旨在让你能够轻松地找到特定的单 ...

  9. 用于构建 RESTful Web 服务的多层架构

    作者:Bruce Sun, Java 架构师, IBM 出处:http://www.ibm.com/developerworks/cn/web/wa-aj-multitier/ 用于构建 RESTfu ...

  10. 转载:CentOS查看本机公网IP命令

    icanhazip.com 使你在任何地方知道你的公网IP地址 icanhazip.com是一个网址,你在浏览器中输入这个网址,你就能得到你的公网IP地址了. 我在Linux下一般使用curl ica ...