WPF
songyi160
这个作者很懒,什么都没留下…
展开
-
第4章 依赖属性(1)——概述
一、概述WPF使用更高级的依赖属性代替原来的.NET属性。依赖属性使用效率更高的保存机制,并支持附加功能,如更改通知以及属性值继承(在元素树中向下传播默认属性值的能力)。同时依赖属性也是WPF许多功能的基础,包括动画、数据绑定以及样式。WPF元素提供的大多数属性都是依赖属性。因为这些依赖属性都使用普通的.NET属性进行了封装,所以使用和普通的.NET属性没有任何区别。二、何原创 2016-10-09 22:08:27 · 1037 阅读 · 0 评论 -
第18章 自定义元素(1)——概述
一、使用自定义控件前要三思在使用WPF以前,动辄使用自定义控件几乎成了惯性思维,比如需要一个带图片的按钮,但在WPF中此类任务却不需要如此大费周章,因为控件可以嵌套使用以及可以为控件外观打造一套新的样式就可以了.是否需要我们来自定义控件,这需要你考虑目前已有控件的真正逻辑功能而不要局限于外观,如果目前的控件都不能直觉地表达你的想法,那么你可以自己来打造一个控件,否则,也许我们仅仅改变一下目原创 2017-02-10 10:25:16 · 555 阅读 · 0 评论 -
第9章 命令(1)——概述
一、概述命令是对应用程序中特定功能的概括总结。特定功能可以是新建、打开、关闭、保存、复制、黏贴、打印等等。命令一旦创建就可通过多种方式去触发执行,如菜单、上下文菜单、工具栏、快捷键等等。二、命令模型命令模型主要由以下4部分组成:命令:表示应用程序特定功能。它不包含执行任务的代码。命令源:触发命令的元素。命令目标:命令要应用的元素。命令绑定:将上面三部分关联在原创 2017-02-28 15:31:46 · 518 阅读 · 0 评论 -
第9章 命令(2)——命令库中命令的使用
一、实例概述下面通过一个例子来说明如何使用ApplicationCommands的Copy命令。在该例中,通过点击按钮实现把一个文本框的内容拷贝到另外一个文本框中。虽然说微软提供了WPF命令库,但是处理函数还是要我们自己去写的。一般我们在窗体中编写命令绑定,这样窗体中的所有元素都可以通过命令调用窗体命令绑定的处理函数。二、使用命令库中的命令有两种方式:XAML代码和原创 2017-02-28 17:21:57 · 541 阅读 · 0 评论 -
第9章 命令(3)——自定义命令的使用
声明一个RoutedCommand或RoutedUICommand对象,使用方式和命令库中命令一样。实例演示:自定义清除命令,实现点击按钮即可清除文本框中的内容xaml前台代码:<Window x:Class="CommandTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xam原创 2017-03-01 09:38:51 · 489 阅读 · 0 评论 -
第7章 Application类(1)——程序集资源
一、概述程序集资源:即为项目添加的文件,经过VS编译会嵌入到EXE或DLL中。程序集资源也称为二进制资源,因为他们作为不透明的二进制数据被嵌入到已编译的程序集中。二、添加资源①在项目中建文件夹,为更好的管理资源,将不同资源放到不同文件夹中,文件夹命名如:Images,Sounds等②右击文件->属性->在属性页面的[生成操作]选项中选择Resource三、检索资源原创 2017-01-24 17:25:40 · 605 阅读 · 0 评论 -
第10章 资源(1)——资源基础
一、概述WPF资源用于保存画刷、样式或模版。尽管可在代码中创建和操作资源,但通常在XAML标记中定义资源。每个元素都有Resources属性,该属性存储一个资源字典集合。尽管每个元素都有Resources属性,但通常在窗口级别定义资源,这是因为窗口内的其它元素都能访问到定义的资源。<Window x:Class="ResourcesDemo.MainWi原创 2017-01-24 23:21:22 · 355 阅读 · 0 评论 -
第10章 资源(2)——资源字典
一、概述当在一个Resources集合中定义较复杂的资源时或一个Resources集合的资源太多不便于管理或需要在多个项目间共享资源时,可通过资源字典方便的解决上述问题。资源字典只是XAML文档,除了存储希望使用的资源外,不做其他任何事情。二、创建资源字典①在项目上[右击]选择[添加]找到[资源字典]②当为应用程序添加资源字典时,务必在其属性页中将[生成操作原创 2017-01-24 23:54:45 · 564 阅读 · 0 评论 -
第10章 资源(3)——程序集间共享资源
一、概述当共享包含一个或多个资源字典的编译过的程序集时,有三种方法提取所希望的资源并在应用程序中使用。三种方法的前提是在应用程序中添加对共享程序集的引用二、C#代码方式只要知道资源所在xaml文件和资源名即可ResourceDictionary resdic = new ResourceDictionary();resdic.Source = new Ur原创 2017-01-26 00:22:42 · 1323 阅读 · 0 评论 -
第17章 控件模版(1)——模版的创建与使用
一、样式与模版概述共同点:都可以改变元素的外观不同点:①样式调整范围小,仅可调整控件的属性,不能改变控件的外观。②模版可使用全新的由不同元素组成的可视化树来代替控件原来的外观。当共享包含一原创 2017-02-02 07:36:15 · 516 阅读 · 0 评论 -
第17章 控件模版(2)——模版绑定
一、模版绑定概述通过第17章 控件模版(1)——模版的创建与使用可以看出为按钮设置Padding属性没有作用,这是我们就需要在模版中特殊注意该属性,这个特殊注意指的就是模版绑定。模版绑定:指模版内的值是从使用模版的控件获取。二、改进模版代码 三、运行效果四、特殊说明原创 2017-02-02 08:08:31 · 303 阅读 · 0 评论 -
第17章 控件模版(3)——属性触发器
一、自定义按钮模版xaml代码首先为模版中的元素设置Name属性,方便后面触发器设置。属性触发器当关注的属性符合预设值时,自动应用对应的属性设置。当属性变化后会自动恢复到设置前的状态。<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:原创 2017-02-02 21:44:38 · 370 阅读 · 0 评论 -
第17章 控件模版(4)——事件触发器
一、自定义按钮模版xaml代码<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.micros原创 2017-02-02 22:00:48 · 649 阅读 · 0 评论 -
第17章 控件模版(5)——组织模版资源概述
①为避免多次定义模板,可在Application类的Resources集合中定义模板资源。然而,一个应用程序只能有一个App.xaml文件和一个Application.Resources集合。因此,在单独资源字典中定义模板是一个更好的主意。这样,可灵活地在特定窗口或在整个应用程序中使用资源。而且还可以结合样式使用,因为任何应用程序都可以包含多个资源字典。②虽然可将所有模板组合到单个资源字典文件原创 2017-02-03 11:45:09 · 292 阅读 · 0 评论 -
第17章 控件模版(6)——通过样式应用模版
通过前面几节的学习可以看出:控件模板硬编码了一些细节,如颜色方案。这意味着如果希望在按钮中使用相同的元素组合(Border、Grid、Rectangle和ContentPresenter)并采用相同的方式安排他们,但希望提供不同的颜色方案,就必须创建引用不同画刷资源的控件模板副本。为了解决上述问题,可将那些需要修改的属性(通常是颜色和字体)从模板中提取出来,通过样式进行设置。<Resour原创 2017-02-03 16:11:27 · 404 阅读 · 0 评论 -
第17章 控件模版(7)——通过样式自动应用模版
①在前面的几节讲解中,每个按钮都是通过设置Template或Style属性将自身关联到适当模板的。但如果想让应用程序中的每个按钮自动应用模板,按照上面的方式进行设置就显得有点麻烦了。②为了解决上述问题,可以通过类型样式,这样样式会自动影响相应的元素类型并设置Template属性。下面是一个样式示例,应将该样式放到您的资源集合中,从而为按钮提供新外观。 注意:此时的样式不要指定键名,这意原创 2017-02-03 21:54:45 · 271 阅读 · 0 评论 -
第12章 形状、画刷和变换(2)——变换元素
一、变换元素概述①变换元素可以使用RenderTransform属性实现变换。②变换元素也可以使用LayoutTransform属性,它以相同的方式变换元素,但在布局之前执行其工作。③在一定程度上,当设置RenderTransform属性和LayoutTransform属性时,WPF不知道它们正在被修改。特别是,变换不会影响元素的ActualHeight和ActualWid原创 2017-02-09 21:53:03 · 479 阅读 · 0 评论 -
第12章 形状、画刷和变换(1)——变换形状
一、变换概述①通过变换可以实现多个功能,如移动、旋转、放大、缩小、倾斜等。②在WPF中变换都已经定义好了对应的类,在使用变换时,仅需要将形状或元素的RenderTransform属性指定为希望使用的变换对象即可。③WPF中使用RenderTransformOrigin属性确定形状或元素的中心,该值是相对值。点(0,0)被指定为左上角,点(1,1)被指定为右下角。④当设置Render原创 2017-02-09 21:42:20 · 476 阅读 · 0 评论 -
WPF控件TabControl和TabItem原模板分析
一、通过Blend查看TabControl模板代码二、tabControlStyleAndTemplate.xaml代码<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="htt原创 2017-02-09 16:06:08 · 21632 阅读 · 0 评论 -
第5章 路由事件(5)——自定义路由事件
一、定义、注册和封装路由事件与依赖属性一样,路由事件由只读的静态字段表示,在静态构造函数中注册,并通过标准的.NET事件进行封装。原创 2016-10-09 10:06:11 · 1091 阅读 · 0 评论 -
第4章 依赖属性(2)——自定义依赖属性
一、定义依赖属性相对于创建依赖属性,大多数情况下只是使用它们。但是,仍然有许多原因需要创建自己的依赖属性。例如:(1)在设计自定义的WPF元素时,定义依赖属性肯定是关键部分。(2)当希望为原本不支持数据绑定、动画或其他WPF功能的部分代码添加这些功能时,也需要创建依赖属性。注意:只能为依赖对象(直接或间接继承自DependencyObject的类)添加依赖属性。幸运原创 2016-10-09 22:36:29 · 1924 阅读 · 0 评论 -
第4章 依赖属性(3)——自定义附加属性
一、概述附加属性也是一种依赖属性,同样由WPF属性系统管理。不同之处在于附加属性被应用到的类并非定义附加属性的那个类。例如,Grid类定义了Row和Column附加属性,这两个属性被用于设置Grid面板包含的元素,以指明这些元素应被放到哪个单元格中。类似地,DockPanel类定义了Dock附加属性,而Canvas类定义了Left、Right、Top和Bottom附加属性。二、定义原创 2016-10-26 22:17:00 · 797 阅读 · 0 评论 -
第4章 依赖属性(4)——属性验证
一、概述在定义任何类型的属性时,都需要面对错误设置属性的可能性。对于传统的.NET属性,可尝试在属性设置器中捕获这类问题。但对于依赖属性而言,这种方法不合适,因为可能通过WPF属性系统可使用SetValue()方法直接设置属性。作为替代,WPF提供了两种方法来阻止非法值:(1)ValidateValueCallback:该回调函数可接受或拒绝新值。通常用于捕获违反属性约束的原创 2016-10-27 15:25:10 · 763 阅读 · 1 评论 -
第5章 路由事件(1)——概述
一、概述 属性和事件是.NET抽象模型的核心部分,是每位.NET编程人员都十分熟悉的主题,但是WPF将属性和事件都进行了升级。WPF创建了一个新的依赖属性系统,重写了传统的.NET属性以提高性能并集成新功能(例如数据绑定和动画)。同时使用更高级的路由事件功能替换普通的.NET事件,使事件可在元素树中向上冒泡和向下隧道传播,并沿着传播路径被事件处理程序处理。二、路由事件有三种形式原创 2016-09-29 14:51:34 · 839 阅读 · 0 评论 -
第5章 路由事件(2)——冒泡路由事件
冒泡路由事件实例演示事件的冒泡过程。当单击标签中的一部分时,在列表框中会显示事件发生的顺序。XAML标记代码:<Window x:Class="WpfApplication5_2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmln原创 2016-09-29 22:05:39 · 867 阅读 · 0 评论 -
第5章 路由事件(3)——隧道路由事件
一、隧道路由事件隧道路由事件的工作方式和冒泡路由事件相同,但方向相反。根据.NET约定,隧道路由事件总是以单词Priview开头(如PreviewKeyDown)。而且,WPF通常成对地定义冒泡路由事件和隧道路由事件。这意味着如果发现冒泡的MouseUp事件,就还可以找到PreviewMouseUp隧道事件。隧道路由事件总在冒泡路由事件之前被触发。注意:如果将隧道路由事件标记为已处原创 2016-10-07 17:11:22 · 1862 阅读 · 0 评论 -
第5章 路由事件(4)——附加路由事件
一、附加事件在第5章 路由事件(2)——冒泡路由事件文章中举的标签示例是一个非常简单的事件冒泡示例,因为所有元素都支持MouseUp事件。然而,许多控件都有各自的特殊事件。例如,按钮控件——它添加了Click事件,其他任何基类而都没有定义该事件。假设有这样一个需求,在StackPanel面板中封装了一堆按钮,并希望在一个事件处理程序中处理所有这些按钮的单击事件。粗略的方法是将每原创 2016-10-07 23:23:11 · 721 阅读 · 0 评论 -
第11章 样式(1)——概述、创建和使用
样式:封装一系列属性的集合,如外边距、内边距、颜色、字体等。①一般在设置样式时都要指明TargeType属性,否则用Setter设置属性时会非常麻烦,比如必须写Button.FontSize或TextBlock.FontFamily等。②若定义样式的时候不使用x:Key键名,则TargeType属性就会作为自动应用样式的快捷键。③样式的键名有两种写法,它俩是等效的:x:Key="{x:原创 2017-02-04 16:53:25 · 498 阅读 · 0 评论 -
第8章 元素绑定(1)——概述、创建设置绑定和绑定到非元素对象
一、概述①简单地说,数据绑定就是将源对象的属性绑定到目标对象的属性。②源对象可以是任何内容,如WPF元素、ADO.NET对象或自行创建的纯数据对象。③数据绑定的最简单情形是元素绑定,即源对象是WPF元素而且源属性是依赖项属性。因为依赖项属性具有内置的更改通知支持。因此,当在源对象中改变依赖项属性的值时,会立即更新目标对象中的绑定属性。二、绑定表达式<Text原创 2017-02-06 14:46:28 · 825 阅读 · 0 评论 -
WPF字体图标——IconFont
一、字体图标概述①字体图标其实就是把矢量图形打包到字体文件里,就像使用一般外置字体一样的使用它,因此Winform、WPF中都是可以用的。②可以在很多地方使用图标字体,包括自定义控件、自定义样式、模板等。③字体图标优点:字体文件非常小,比使用png等图片文件要小很多和普通字体一样,是矢量的,可任意放大缩小,且不会失真网上开源字体图标很多,很容易获原创 2017-02-07 10:31:14 · 10933 阅读 · 1 评论 -
WPF字体图标——FontAwesom
一、字体图标概述FontAwesome是迄今为止最出色的图标字体(没有之一),优点是图标多、图标美观、兼容各种应用场景等。二、获取FontAwesome字体图标库FontAwesome主页GitHub的下载地址FontAwesome字体图标列表三、加压下载到的字体库压缩包,得到字体图标库文件四、像WPF原创 2017-02-07 11:25:03 · 3630 阅读 · 1 评论 -
第15章 动画基础(1)——概述、通过代码创建动画和动画的生命周期
一、动画概述①动画是WPF模型的核心部分。这意味着为了让动画动起来,不需要使用计时器以及事件处理代码,只需要使用声明的方式即可创建动画。②WPF动画是基于属性的动画。本质上,WPF动画只不过是在一段时间间隔内修改下依赖项属性而已。③创建正确动画的秘密在于决定需要修改什么属性。④为了实现属性的动态化,需要有支持相应数据类型的动画类。如Button.Width属性使用双原创 2017-02-08 14:48:02 · 897 阅读 · 0 评论 -
第15章 动画基础(2)——故事板、触发器
一、故事板①故事板是增强型的时间线,可用来分组多个动画,而且具有动画播放的能力(暂停、停止以及改变播放位置)。②一个故事面板中可以放置多个动画,并且每个动画可用于不同的元素和属性。③故事面板的定义如下: <DoubleAnimation Storyboard.TargetName="cmdGrow" Storyboard.原创 2017-02-08 16:18:25 · 571 阅读 · 0 评论 -
第15章 动画基础(3)——XAML内联计算的实现
一、XAML内联计算①定义一个类实现IValueConverter接口②在窗口资源中导入定义的类 ③使用定义的类实现内联计算,如Storyboard的To属性的设置:To="{Binding ElementName=window,Path=Width,Converter={StaticResource converter},ConverterParameter原创 2017-02-08 16:49:01 · 932 阅读 · 0 评论 -
第17章 控件模版(8)——动态换肤
基本原理:在程序运行时加载新的资源字典,并使用新加载的资源字典代替当前的资源字典(不需要替换所有资源,只需要替换哪些用于皮肤的资源)。有两种方式实现动态换肤:①检索ResourceDictionary对象,并通过后台代码替换资源实现动态换肤。②通过编写代码加载资源字典,然后通过后台代码替换资源实现动态换肤。实例演示动态换肤:假设有已创建用于定义同一个按钮控件模板的两个资源。一个原创 2017-02-04 11:21:56 · 431 阅读 · 0 评论