WPF控件开发基础(1)

简介:         http://www.cnblogs.com/Clingingboy/archive/2008/07/03/wpfcustomcontrolpart-1.html 从现在开始,我将尝试写有关WPF控件开发相关的知识,把文章这对我来说很难,所以这个系列的文章在时间跨度上可能会拖的比较长。

        http://www.cnblogs.com/Clingingboy/archive/2008/07/03/wpfcustomcontrolpart-1.html

从现在开始,我将尝试写有关WPF控件开发相关的知识,把文章这对我来说很难,所以这个系列的文章在时间跨度上可能会拖的比较长。我希望我介绍是比较详细的,而不仅仅是一个简单的控件开发流程。我是一个真正的Web开发人员,很少尝试编写客户端程序,之所以开发WPF,一方面是项目的需要,另一方面则是WPF的xaml编程的标签化,使得像我这样的web开发人员很容易接受,去尝试,大家学习当中可以与web控件开发进行比较。

一.画一个椭圆 

我们该从哪里开始?我们从显示开始。使用WPF,可以很容易的就创建一个图形,比如一个椭圆

< Ellipse  Margin ="34,45,44,117"  Name ="ellipse1"  Stroke ="Black"  Fill ="Red"   />


图一

 二.定义控件的样式
上面的Ellipse似乎与控件无关,但却是控件的组成部分.我们再来定义一个我们非常熟悉的 Label控件,此控件会在界面上显示"hello"字符串.
< Label  Content ="hello" ></ Label >

接下来我需要Label控件的背景以Ellipse来显示,可以使用WPF的样式和模板来重新定制外观,代码如下

Code
    <Grid>
        
<Grid.Resources>
            
<Style TargetType="Label">
                
<Setter Property="Template">
                    
<Setter.Value>
                        
<ControlTemplate TargetType="Label">
                            
<Grid>
                                
<Ellipse Margin="34,45,44,117" Fill="{TemplateBinding Background}"/>
                            
</Grid>
                        
</ControlTemplate>
                    
</Setter.Value>
                
</Setter>
            
</Style>
        
</Grid.Resources>
        
<Label Background="Red" Content="hello WPF control"></Label>
    
</Grid>

效果与图一相同, 我们似乎忘了把Content属性的内容显示出来,所以我们还要借助一个控件把Content显示出来.
使用 TextBlock?不行,它的Text属性是不折不扣的String类型,那么我们使用Label控件来绑定Content,代码如下
(之前的上下文代码省略)
< Ellipse  Margin ="34,45,44,117"  Fill =" {TemplateBinding Background} " />
< Label  Content =" {TemplateBinding Content} " ></ Label >

重新编译下,似乎并未通过,那我们使用 ContentControl 控件吧
< ContentControl Content =" {TemplateBinding Content} " ></ ContentControl >

效果如图,效果是显示出来了.

三.显示控件的内容

ContentControl在实际中可能很少使用,但却很重要,这便是我引出的话题.我们来看下Label控件的父类,就是 ContentControl,为什么不是Control类?
如Label控件的Content属性其实是由ContentControl类定义的,目的是为了将Content的内容显示在WPF窗体。那没有了ConentControl类,我们就不能将内容显示在WPF窗体上了吗?或者问 ContentControl类的Content是如何显示在WPF窗体上的呢?
这里我们就需要知道 ContentPresenter类的作用,ContentPresenter的作用就是显示内容,但Control类没有这个Content属性,所以在Control类之上写了一个ContentControl类,然后ContentPresenter(其显示依赖于ContentControl类)负责将ContentControl的Content属性显示出来。每个控件都有一个默认的ContentPresenter用于显示Content内容,我们称这种控件为内容控件。所以上面的示例的样式最终代码如下
复制代码
     < Grid >
        
< Grid.Resources >
            
< Style  TargetType ="Label" >
                
< Setter  Property ="Template" >
                    
< Setter.Value >
                        
< ControlTemplate  TargetType ="Label" >
                            
< Grid >
                                
< Ellipse  Margin ="34,45,44,117"  Fill =" {TemplateBinding Background} " />
                                
< ContentPresenter  Content =" {TemplateBinding Content} "  HorizontalAlignment ="Center"
                            VerticalAlignment
="Center" />
                            
</ Grid >
                        
</ ControlTemplate >
                    
</ Setter.Value >
                
</ Setter >
            
</ Style >
        
</ Grid.Resources >
        
< Label  Background ="Red"  Content ="hello WPF control" ></ Label >
    
</ Grid >
复制代码

在继承Control类的情况下,你同样可以使用ContentPresenter类,不过你需要自己准备一个属性与其Content属性绑定。

如果看了上面的解释不理解的话,我们下面可以通过一个很好的范例来理解这一点。

MasterPage示例(本示例来codeproject)

这是一篇非常好的文章
WPF没有MasterPage这一概念,通常框架会使用一个容器来加载一个模块,作者利用WPF的模板和ContentPresenter很好的展示了这一技术
其定义了一个MasterPage类,然后定义了三个属性,再以ContentPresenter来显示这三个属性内部的内容.

总结一下
1.如Ellipse是为了在模板中装饰控件外观,可以通过控件的属性与其属性绑定来美化控件
2.ContentPresenter用于显示控件的ContentControl的Content属性

So 控件=外观+内容
好了,本文结束
相关文章
|
2天前
|
C# 开发者 Windows
基于Material Design风格开源、易用、强大的WPF UI控件库
基于Material Design风格开源、易用、强大的WPF UI控件库
|
2天前
|
C#
浅谈WPF之装饰器实现控件锚点
使用过visio的都知道,在绘制流程图时,当选择或鼠标移动到控件时,都会在控件的四周出现锚点,以便于修改大小,移动位置,或连接线等,那此功能是如何实现的呢?在WPF开发中,想要在控件四周实现锚点,可以通过装饰器来实现,今天通过一个简单的小例子,简述如何在WPF开发中,应用装饰器,仅供学习分享使用,如有不足之处,还请指正。
68 1
|
9月前
|
C# Windows
WPF技术之图形系列Polygon控件
WPF Polygon是Windows Presentation Foundation (WPF)框架中的一个标记元素,用于绘制多边形形状。它可以通过设置多个点的坐标来定义多边形的形状,可以绘制任意复杂度的多边形。
491 0
|
9月前
|
C# Windows
WPF技术之RichTextBox控件
WPF RichTextBox是Windows Presentation Foundation (WPF)中提供的一个强大的文本编辑控件,它可以显示富文本格式的文本,支持多种文本处理操作。
360 0
|
2天前
|
前端开发 C# 容器
浅谈WPF之控件拖拽与拖动
使用过office的visio软件画图的小伙伴都知道,画图软件分为两部分,左侧图形库,存放各种图标,右侧是一个画布,将左侧图形库的图标控件拖拽到右侧画布,就会生成一个新的控件,并且可以自由拖动。那如何在WPF程序中,实现类似的功能呢?今天就以一个简单的小例子,简述如何在WPF中实现控件的拖拽和拖动,仅供学习分享使用,如有不足之处,还请指正。
118 2
|
9月前
|
数据挖掘 数据处理 C#
WPF技术之DataGrid控件
WPF DataGrid是一种可以显示和编辑数据的界面控件。它可以作为表格形式展示数据,支持添加、删除、修改、排序和分组操作。
189 0
|
2天前
|
C# 开发者 C++
一套开源、强大且美观的WPF UI控件库
一套开源、强大且美观的WPF UI控件库
147 0
|
6月前
|
算法 C# UED
浅谈WPF之控件模板和数据模板
WPF不仅支持传统的Windows Forms编程的用户界面和用户体验设计,同时还推出了以模板为核心的新一代设计理念。在WPF中,通过引入模板,将数据和算法的“内容”和“形式”进行解耦。模板主要分为两大类:数据模板【Data Template】和控件模板【Control Template】。
105 8
|
9月前
|
定位技术 C# UED
WPF技术之ScrollViewer控件
WPF ScrollViewer是WPF中常用的一个控件,它提供了滚动视图的功能,可用于显示超出容器可视区域的内容。ScrollViewer通常用于容纳大量内容的控件,以在有限的空间内显示这些内容,并允许用户通过滚动来查看隐藏的部分。
809 0
|
9月前
|
前端开发 C#
WPF技术之ContentControl 控件
ContentControl 是 WPF 中的一个常见控件,用于显示单个内容元素。它可以包含任意类型的内容,包括文本、图像、控件等。
839 0