WPF 控件模板

WPF中每个控件都被设计为无外观的,这意味着我们可以通过一定的方式,完全重定义其可视化外观,而WPF也提供了这种改变外观的方式之一,我们称为模板。wpf的模板有多种方式,可以分为控件模板(ControlTemplate),控件列表模板(ItemsPanelTemplate)和数据模板(DataTemplate)。其中ControlTemplate和ItemsPanelTemplate都属于控件模板,但又有不同的表示。

1、控件模板(ControlTemplate)

理解控件模板,首先得理解两个概念逻辑树和可视化树,逻辑树是我们最基本的要素列表,可视化树是逻辑书的扩展版本,它将元素分为更小的部分。换句话说说,逻辑树仅仅关心到控件级别,而可视化树关心到控件的组成的最基本图形元素。

1.1 定义模板样式

每个控件都有一个内置的方法,用于确定如何渲染控件,该方法称为控件模板,可以使用XAML标记块定义,下面我们定义一个普通的按钮的模板:

<Button x:Name="btn1" Click="Button_Click" >
         <Button.Template >
             <ControlTemplate >
                 <Grid >
                     <Ellipse Name="faceEllipse" Height="50" Width="100" Fill="{TemplateBinding Button.Background}"/>
                     <TextBlock Name="txtBlock"  Text="text" VerticalAlignment="Center" HorizontalAlignment="Center" />
                 </Grid >
             </ControlTemplate >
         </Button.Template>
     </Button>

效果如下:

模板是控件的Template 属性,Template 是一个ControlTemplate对象,我们可以重定义这个对象,就是重新定义了按钮的界面,ControlTemplate里面可以使用任何控件,比如以下代码:

<Button x:Name="btn1" Click="Button_Click" >
        <Button.Template >
            <ControlTemplate >
                <Grid >
                    <Ellipse Name="faceEllipse" Height="50" Width="100" Fill="{TemplateBinding Button.Background}"/>
                    <TextBlock Name="txtBlock"  Text="text" VerticalAlignment="Center" HorizontalAlignment="Center" />
                    <CheckBox  IsChecked="True"></CheckBox>
                </Grid >
            </ControlTemplate >
        </Button.Template>
    </Button>

其效果如下:

不过这种做法不常见,使用的时候需要谨慎处理。

1.2 模板触发器

触器是模板里面一个常用的功能,能为当前控件提供显示的多样性和多状态提供的触发机制,比如按钮,鼠标移上和鼠标移开,获取焦点和非焦点,都不一样,这些在不同状态下的显示,就需要触发器完成,触发器的详细讲解,请查看http://www.cnblogs.com/minhost/p/7464148.html。控件模板触发器,基本能触发常规的触发器,属性和事件等。我们看看触发器如何使用:

<Button x:Name="btn1" Click="Button_Click" >
         <Button.Template >
             <ControlTemplate >
                 <Grid >
                     <Ellipse Name="faceEllipse" Height="50" Width="100" Fill="{TemplateBinding Button.Background}"/>
                     <TextBlock Name="txtBlock"  Text="text" VerticalAlignment="Center" HorizontalAlignment="Center" />
                 </Grid >
                 <ControlTemplate.Triggers >
                     <Trigger Property="Button.IsMouseOver" Value="True">
                         <Setter Property="Button.Background" Value="blue"/>
                     </Trigger >
                 </ControlTemplate.Triggers >
             </ControlTemplate >

         </Button.Template>
     </Button>

以上触发器,就是当前鼠标经过的时候,让按钮的背景变为蓝色,可以看到效果如下:

1.3 模板的复用

我们上面的案例,只是把模板放在按钮内部,那么只有这个按钮才能使用,为了实现共享模板等,我们可以把模板定义在resource里面,所以我们完全可以把以上代码添加到window.resource中,如以下代码:

<Window.Resources>
      <ControlTemplate  x:Key="btntemp">
          <Grid >
              <Ellipse Name="faceEllipse" Height="50" Width="100" Fill="{TemplateBinding Button.Background}"/>
              <TextBlock Name="txtBlock"  Text="text" VerticalAlignment="Center" HorizontalAlignment="Center" />
          </Grid >
          <ControlTemplate.Triggers >
              <Trigger Property="Button.IsMouseOver" Value="True">
                  <Setter Property="Button.Background" Value="blue"/>
              </Trigger >
          </ControlTemplate.Triggers >
      </ControlTemplate >
  </Window.Resources>
  <Canvas>
      <Button x:Name="btn1" Click="Button_Click" Template="{StaticResource btntemp}"></Button>
  </Canvas>

能实现以上相同功能,假如有多个按钮的话,则可以对模板进行复用,如果我们想当前窗体所有的按钮都统一样式,则可以指定 <ControlTemplate  x:Key="btntemp" TargetType="Button">,那么界面上所有的按钮(除非特别指定)都会使用当前样式。

 

时间: 2024-10-12 21:01:02

WPF 控件模板的相关文章

c#字符串加载wpf控件模板代码 - 简书

原文:c#字符串加载wpf控件模板代码 - 简书 ResourceManager resManagerA = new ResourceManager("cn.qssq666.Properties.Resources", typeof(cn.ijiami.keyboard.Properties.Resources).Assembly); string astring = resManagerA.GetString("axml_test"); LogUtil.write

WPF控件模板与数据模板(6)

什么是ControlTemplate? ControlTemplate(控件模板)不仅是用于来定义控件的外观.样式, 还可通过控件模板的触发器(ControlTemplate.Triggers)修改控件的行为.响应动画等. 通过剖析控件了解ControlTemplate的组成: 首先,创建一个WPF项目, 创建一个Button按钮, 然后选中该按钮, 右键选择编辑模板>编辑副本: 创建完成后, 会在当前页面<Windows.Resources> 键下面生成一些样式片段 , 一个key为B

WPF控件模板和数据模板 - 醉意人间

来自:http://www.th7.cn/Program/WPF/2011/12/21/51676.shtml ControlTemplate用于描述控件本身. 使用TemplateBinding来绑定控件自身的属性, 比如{TemplateBinding Background} DataTemplate用于描述控件的Content. 使用Binding来绑定数据对象的属性, 比如{Binding PersonName} 一般来说, ControlTemplate内有一个ContentPrese

WPF 中动态改变控件模板

在某些项目中,可能需要动态的改变控件的模板,例如软件中可以选择不同的主题,在不同的主题下软件界面.控件的样式都会有所不同,这时即可通过改变控件模板的方式实现期望的功能. 基本方法是当用户点击切换主题按钮是加载新的资源字典,并使用新加载的资源字典替代当前的资源字典这时要用到ResourceManager. 假设现有两个不同的资源字典文件Dictionary1.xaml和Dictionary2.xaml存在于Themes文件夹内: 在MainPage中使用其中一个资源字典作为默认样式文件: <Win

WPF笔记(1.9 样式和控件模板)——Hello,WPF!

原文:WPF笔记(1.9 样式和控件模板)--Hello,WPF! 资源的另一个用途是样式设置: <Window >  <Window.Resources>    <Style x:Key="myStyle" TargetType="{x:Type TextBlock}">      <Setter Property="VerticalAlignment" Value="Center"

《Programming WPF》翻译 第5章 7.控件模板

原文:<Programming WPF>翻译 第5章 7.控件模板 如果仔细的看我们当前的TTT游戏,会发现Button对象并没有完全为我们工作.哪些TTT面板有内圆角? 图5-14 这里,我们真正需要的是能够保持按钮的行为,如支持内容和点击事件,但是我们想要接管这些按钮的外观.WPF允许这种方式,因为内在的控件创建的时候是缺少外观性的,例如,他们提供行为,但是外观可以被完全包装在客户端控件的外面. 还记得我们是如何使用数据模板,来为非可视化对象提供外观的么?我们能够使用控件模板对控件做同样的

WPF中的ControlTemplate(控件模板)(转)

原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/28/690993.html WPF中的ControlTemplate(控件模板)                                                                                                                        周银辉 WPF包含数据模板和控件模板,其中控件模板又包括Contro

【WPF学习】第五十九章 理解控件模板

最近工作比较忙,未能及时更新内容,敬请了解!!! 对于可视化树的分析引出了几个有趣问题.例如,控件如何从逻辑树表示扩张成可视化树表示? 每个控件都有一个内置的方法,用于确定如何渲染控件(作为一组更基础的元素).该方法称为控件模板(control template),是用XAML标记块定义的. 下面是普通Button类的模板的简化版本.该版本省略了XML明朝空间声明.为嵌套的元素设置属性的特性,以及当按钮被禁用.取得焦点或单击时确定按钮行为的触发器: <ControlTemplate ...>

WPF 学习之控件模板 ControlTemplate Triggers

控件模板ControlTemplate,有两部分:VistualTree视觉树,即是能看到的外观:Trigger触发器,里面包括外部条件达到某一条件下会引起的响应. <Window.Resources> <ControlTemplate x:Key="ButtonTempalted" TargetType="{x:Type Button}"> <Border Name="Border" BorderThickness