Content + ContentControl + ControlTemplate(学习)

System.Windows.Controls -- 即各种控件如:Button, CheckBox

System.Windows.Controls这个命名空间。

    首先是Control,继承于FrameworkElement。Silverlight2.0中大部分的控件(Button等)都来自于2个类,一个就是 Control,另一个是ContentControl。ContentControl是对Control类的扩展,并继承了IADDChild接口,增加了AddChild和AddText两个函数来实现添加内容属性(Content)的功能。

对于内容属性(Content), 我在后面介绍。另外还有类型为DataTemplate的成员ContentTemplate用来包含内容属性的模板。

 

Code

 

    在这里来说下控件属性的几种形式。

1.属性/值 类型

    这是一种很常见的也是Silverlight中最常用的方式。就不解释了,很简单。

 

SilverlightControl1

 

    当我们的属性不只是一个很单一简单的值时,我们可以这样来做。

 

SilverlightControl2

2.内容属性

    继承于ContentControl的控件有些特殊的属性,就是内容属性Content。

 

SilverlightControl3

    在对Content属性进行定义的时候只能允许定义一次。这样看来似乎这样的做法有一定的局限性。其实不然。作为对Content属性的考 虑,可能是为了强制性的加上panel类型的布局样式的缘故。所以如果你同时在Content属性内放入多于1个控件的话会有 The property 'Content' is set more than once. 的错误,但是你可以这样来做。

 

SilverlightControl5

3.附加属性

    这是个很重要的赋值方法。这可以通过附加属性来为父结点定义属性。最典型的例子就是Canvas布局时用来定义Canvas里面元素。

 

SilverlightControl4

    ContentControl(内容属性)通过这种包括方式来丰富原有的控件。你可以用这样的方式来建造自定义控件,来改变原有默认控件的表达方式。下面我来说一个重要的属性ContentTemplate(控件模板)。

ControltTemplate

Silverlight2.0 beta1 中增加了对控件模板的支持。在WPF中控件包括ControlTemplate和ItemsPanelTemplate(即一个是控件的模板一个是Items的模板)。这里讨论一下ControlTemplate。

    ControlTemplate描述了控件的外观以及对应的触发方法Trigger(与样式Style不用,Style只能改变原控件已有的属性(大小,位置,颜色啊。。。)来定制控件,而控件模板则可以改变控件的内部结构即VisualTree)可以打个比方,假如说Style是将已有的东西变得更漂亮些,那ContentTemplate就是用已有的东西来做一些新的自定义的控件。

    要改变控件的模板,我们需要声明一个ControlTemplate对象,并对该ControlTemplate对象做相应的配置,然后将该ControlTemplate对象赋值给控件的Template属性-即控件的Template属性接受新的ControlTemplate

 

SilverlightControl6

    这样的写法可能太局限了,比如Width,Height这类的属性我需要能够动态的设置来达到不同的效果,我们可以使用TemplateBinding将控件的属性与调用这个模板的父级的属性关联起来。上面的代码就变成了这样

 

SilverlightControl7

    刚才我们说了ContentTemplate可以改变控件的内部结构VisualTree,其实ControlTemplate还有另一个 重要的属性就是Triggers触发器。可以改变控件的事件比如移入移出事件(hover,mousemove等)Silverlight2.0 beta1中虽然智能提示里会出现Triggers的提示,但实际上Silverlight2.0 beta1里并不支持Triggers,Scott在博客中写了关于Silverlight2.0 beta1支持的有Style,DataTemplate,ControlTemplate。所以这里也就不涉及Triggers,等beta2出来以后我们再研究吧。:)
    下一次我们来说下Style样式和DataTemplate,这里说下在Scott在介绍Silverlight2.0的第八篇中介绍Silverlight转到WPF桌面程序中少说了,其实Listbox的数据绑定方法有点区别所以也需要更改,不然会有点小问题,有空写一篇自己step by step过程遇到的问题并带自己写的代码。

转载于:https://www.cnblogs.com/shawnzxx/archive/2012/10/01/2709985.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如下是一个标准的 ControlTemplate,它的 TargetType 为 ContentControl,在 WPF 中使用: ```xml <ControlTemplate TargetType="{x:Type ContentControl}"> <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"> <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/> </Border> </ControlTemplate> ``` 这个 ControlTemplate 定义了一个 Border 元素,它的背景、边框画刷和边框粗细都是由 ContentControl 绑定的。它的子元素是 ContentPresenter,它的内容、内容模板都是由 ContentControl 绑定的。 ### 回答2: 一个符合标准的WPF中的ControlTemplate,其TargetType为ContentControl,可以被如下定义和实现: ```xml <Style TargetType="{x:Type ContentControl}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ContentControl}"> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Content="{TemplateBinding Content}" /> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> ``` 这个ControlTemplate的目标类型是ContentControl,使用了一个Border作为容器,用于设置边框背景和边框样式。内部有一个ContentPresenter,用于呈现ContentControl的内容。ContentPresenter的水平对齐和垂直对齐方式都设置为居中,以确保内容在容器中居中显示。 在实际使用时,可以将此ControlTemplate应用于任何TargetType为ContentControl的控件,例如: ```xml <ContentControl Template="{StaticResource StandardContentControlTemplate}"> <!-- 这里放置需要呈现的内容 --> </ContentControl> ``` 通过这个标准的ControlTemplate,可以统一ContentControl的外观样式,增强应用界面的一致性和美观性。 ### 回答3: 当我们在WPF中使用ControlTemplate时,"TargetType="{x:Type ContentControl}"定义的模板将适用于ContentControl及其所有派生类的控件。 以下是一个WPF中标准的,TargetType="{x:Type ContentControl}"的控件模板的示例: ```xml <ControlTemplate TargetType="{x:Type ContentControl}"> <Border BorderBrush="Black" BorderThickness="1" Background="LightGray" CornerRadius="5"> <!-- 内容控件的内容将放置在这里 --> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> </Border> </ControlTemplate> ``` 在这个示例中,我们使用了一个Border控件来包裹ContentControl的内容。该Border具有黑色边框、灰色背景和圆角边框。 ContentPresenter用于呈现ContentControl中的内容,它被设置为水平和垂直居中,使得内容在Border中居中显示。 使用这个模板时,可以通过将模板应用到ContentControl的Style中来覆盖默认模板。例如: ```xml <ContentControl Content="Hello, World!" Style="{StaticResource MyContentControlStyle}" /> ``` 其中,MyContentControlStyle是已定义的样式,它引用了上述的标准模板。 这样,ContentControl将使用定义的控件模板进行呈现,显示带有边框和背景的内容。 希望这个回答能够对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值