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 控件=外观+内容
好了,本文结束
相关文章
|
C# 开发者 Windows
WPF 应用程序开发:一分钟入门
本文介绍 Windows Presentation Foundation (WPF),这是一种用于构建高质量、可缩放的 Windows 桌面应用程序的框架,支持 XAML 语言,方便 UI 设计与逻辑分离。文章涵盖 WPF 基础概念、代码示例,并深入探讨常见问题及解决方案,包括数据绑定、控件样式与模板、布局管理等方面,帮助开发者高效掌握 WPF 开发技巧。
617 65
|
SQL 中间件 C#
一个使用 WPF 开发的管理系统
一个使用 WPF 开发的管理系统
420 4
|
网络协议 网络安全 C#
基于 WPF 开发的简约,功能强大的终端模拟器
基于 WPF 开发的简约,功能强大的终端模拟器 前言今天大姚给大家推荐一款基于 WPF 开发的简约,功能强大的终端模拟器:ModengTerm。项目介绍ModengTerm是一款基于 WPF 开发的简约,功能强大的终端模拟器,可以用来连接SSH服务器,串口,TCP服务器,Windows命令行等。项目功能支持与SSH服务器,串口,Windows命令行进行交互。可以保存会话信息,方便下次直接登录。支持将终端内容导出为txt和html格式。根据关键字/正则表达式进行历史记录的查找。同步输入功能、历史记录、度可定制化的颜色主题、实时记录日志功能等。项目源码运行设置ModengTerm为启动项目运行:
434 0
|
容器 C# Docker
WPF与容器技术的碰撞:手把手教你Docker化WPF应用,实现跨环境一致性的开发与部署
【8月更文挑战第31天】容器技术简化了软件开发、测试和部署流程,尤其对Windows Presentation Foundation(WPF)应用程序而言,利用Docker能显著提升其可移植性和可维护性。本文通过具体示例代码,详细介绍了如何将WPF应用Docker化的过程,包括创建Dockerfile及构建和运行Docker镜像的步骤。借助容器技术,WPF应用能在任何支持Docker的环境下一致运行,极大地提升了开发效率和部署灵活性。
954 1
|
C# 开发者 Windows
一款基于Fluent设计风格、现代化的WPF UI控件库
一款基于Fluent设计风格、现代化的WPF UI控件库
812 1
|
C# Windows
WPF中如何使用HandyCotrol控件库
WPF中如何使用HandyCotrol控件库
2273 1
|
测试技术 C# 开发者
“代码守护者:详解WPF开发中的单元测试策略与实践——从选择测试框架到编写模拟对象,全方位保障你的应用程序质量”
【8月更文挑战第31天】单元测试是确保软件质量的关键实践,尤其在复杂的WPF应用中更为重要。通过为每个小模块编写独立测试用例,可以验证代码的功能正确性并在早期发现错误。本文将介绍如何在WPF项目中引入单元测试,并通过具体示例演示其实施过程。首先选择合适的测试框架如NUnit或xUnit.net,并利用Moq模拟框架隔离外部依赖。接着,通过一个简单的WPF应用程序示例,展示如何模拟`IUserRepository`接口并验证`MainViewModel`加载用户数据的正确性。这有助于确保代码质量和未来的重构与扩展。
1027 0
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
637 0
|
区块链 C# 存储
链动未来:WPF与区块链的创新融合——从智能合约到去中心化应用,全方位解析开发安全可靠DApp的最佳路径
【8月更文挑战第31天】本文以问答形式详细介绍了区块链技术的特点及其在Windows Presentation Foundation(WPF)中的集成方法。通过示例代码展示了如何选择合适的区块链平台、创建智能合约,并在WPF应用中与其交互,实现安全可靠的消息存储和检索功能。希望这能为WPF开发者提供区块链技术应用的参考与灵感。
297 0
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
1114 0