2023年7月19日发(作者:)
在WPF中⾃定义控件为快速地为你的应⽤定制⼀个零部件,你需要的是UserControl,这可以参考 , 为了让你打造的控件更标准化,更灵活以及更具有普遍意义,你需要⽤到的CustomControl,这正是本⽂要介绍的.
1,新建CustomControl
在选择控件基类后,第⼀件事情便是在你的项⽬中新建"CustomControl",我们会发现在项⽬中⾃动⽣成了⼀个*.CS(或*.VB或其他)⽂件以及/Themes/ (如果原来没有的话),他们分别是CustomControl的后台代码⽂件(Code Behind)与控件的默认主题⽂件,打开/Themes/ ,你会发现其中⾃动⽣成了⼀个Style,这是你的控件的默认样式,正如WPF内置控件也有它的默认样式⼀样.这时,我们的⼯作就被分成了两个部分,⼀是在⽂件中编辑控件逻辑,⽽是在中编写其UI.
2,中的Style是如何与我们的控件联系在⼀起的
打开⽂件,你会发现静态构造⽅法中,VS⾃动地帮你覆盖了控件的DefaultStyleKey值:
static CustomControl1() { deMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1))); }我们知道DefaultStyleKeyProperty是FrameworkElement以及FrameworkContentElement类⽤来指⽰控件的默认样式键值的属性,该属性有⼀个很特别的地⽅就是我们不能够⽤继承的思想来思考它,⽐如说Button的默认样式键值是Style1,其⼦类MyButton的默认样式键值是Style2(或者没有指定默认样式),尽管MyButton可以向上转型成Button类,但我们并不希望其转型后的默认样式键值为Style1.所以WPF采⽤了在⼦类控件的静态构造⽅法中重写DefaultStyleKey元数据的⽅式来指定该⼦类控件的默认样式.上⾯代码中,我们将 newFrameworkPropertyMetadata(typeof(CustomControl1))指定为其新的元数据值,这个值代表着,我们将在资源字典中查找⼀个键值为typeof(CustomControl1)的Style来做为控件的默认样式.⽽这个样式刚好被我们定义在了中:
< Style TargetType = " {x:Type local:CustomControl1} " >
< Setter Property = " Template " >
< >
< ControlTemplate TargetType = " {x:Type local:CustomControl1} " >
< Border Background = " {TemplateBinding Background} "
BorderBrush = " {TemplateBinding BorderBrush} "
BorderThickness = " {TemplateBinding BorderThickness} " >
Border >
ControlTemplate >
>
Setter >
Style >
这是⼤家可能有个疑问,上⾯XAML中的Style并没有指定Key值啊,⽽我们的控件要求的默认样式Key值为typeof(CustomControl1), 并且资源字典中的元素肯定是要有Key的? 这是Style的基本知识了,在WPF中,为Style指定Key时有两种⽅式:⼀是明确指定Key,⽽是在没有明确指定Key的情况下指定TargetType,WPF会⾃动地将其可Key设置为typeof(TargetType).如果你有在Blend中为控件打造Style的经验的话,你会注意到新建⼀个Style时,Blend会提供⼀个"Apply to ALL"选项,这也是为什么你打造的Style可以"Apply to all"的奥秘所在.
3, ""这个名称并⾮偶然
通过上⾯的叙述,你可能会有冲动将中的Style代码剪切出来,粘贴到任何⼀个我们的控件可以找到的地⽅,然后把删掉或改成更优雅的名称,如果你运⽓好的话,这是可⾏的,因为控件会⾃下⽽上(Page,App,Theme)去查找其所需要的Style,但此时你已经犯了⼀个潜在的错误:你没有为控件提供默认的样式.这⾥的默认样式其实是说"在默认主题中或没有为该控件找到当前操作系统对应的主题时采⽤的的样式".这涉及到WPF中Theme的相关话题了,有兴趣可以参考msdn相关SDK.
4,打造你的控件逻辑
这是必然的,添加属性,添加事件,⽅法等等,这些你可以参考 ,这⾥就不重复叙述了.
5,打造控件UI
这⾥值得⼀提的是我⾮常佩服在VS的XAML海洋⾥"裸泳"的兄弟们,不过我更推荐使⽤Microsoft Expression Blend来完成这项艰巨的任务.另外,如果你发现WPF内置控件在Blend中很好⽤⽽我们⾃⼰打造的控件却不是这样,那么请注意了,你的控件逻辑可能设计得不规范.
6,控件UI部分与逻辑部分的耦合度.这是⼀个容易被忽略但却⾮常重要的问题, 我们之所以使⽤CustomControl⽽不是UserControl,是因为我们希望⾃⼰的控件能向WPF内置控件⼀样,其UI能轻易地被其他⽤户定制或我们将来所改变.也就是说其视觉树不能与后台逻辑纠缠在⼀起,因为其视觉树中的元素完全可能被你的控件⽤户改变.⽐如,如果你的控件的视觉树中有⼀个Button,⽽你在该Button的Click事件中做了⼀些控件的逻辑处理,那么很可能你的控件打造失败了,因为该Button可能会在⽤户重新定义控件Template时被删除.
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689721038a280962.html
评论列表(0条)