依赖项属性 定义依赖项属性 注意:只能为依赖对象(继承自DependencyObject的类)添加依赖项属性.WPF中的元素基本上都继承自DependencyObject类. 静态字段 名称约定(属性末尾加上Property) Readonly(只能在静态构造函数中进行设置) public static readonly DependencyProperty ScalingRatioProperty = DependencyProperty.Register("ScalingRatio"…
将元素绑定在一起 数据绑定最简单的形式是:源对象是WPF元素而且源属性是依赖项属性.依赖项属性内置了更改通知支持,当源对象中改变依赖项属性时,会立即更新目标对象的绑定属性. 元素绑定到元素也是经常使用的,可以使元素的交互自动化,而不必编写代码. 绑定表达式 Visibility="{Binding Path=IsChecked, ElementName=rdKer, Converter={StaticResource EqualVisibleConverter}, ConverterParame…
数据提供者 在大多数的代码中,都是通过设置元素的DataContext属性或者列表控件的ItemsSource属性,从而提供顶级的数据源.当数据对象是通过另一个类构造时,可以有其他选择. 一种是作为窗口的资源定义数据对象.如果能够使用声明的方式构造对象,这种方法工作的很好,但是如果需要在运行时使用数据库等方式获取数据,这种技术就没有意义了.但是会出现部分开发人员采用这种方法,基本思路是在构造函数中获取所需的数据. <Window.Resources>     <local:PhotoLi…
系列文章链接 WPF进阶技巧和实战01-小技巧 WPF进阶技巧和实战02-布局 WPF进阶技巧和实战03-控件(1-控件及内容控件) WPF进阶技巧和实战03-控件(2-特殊容器) WPF进阶技巧和实战03-控件(3-文本控件及列表控件) WPF进阶技巧和实战03-控件(5-列表.树.网格01) WPF进阶技巧和实战03-控件(5-列表.树.网格02) WPF进阶技巧和实战03-控件(5-列表.树.网格03) WPF进阶技巧和实战03-控件(5-列表.树.网格04) WPF进阶技巧和实战04-资…
系列文章链接 WPF进阶技巧和实战01-小技巧 WPF进阶技巧和实战02-布局 WPF进阶技巧和实战03-控件(1-控件及内容控件) WPF进阶技巧和实战03-控件(2-特殊容器) WPF进阶技巧和实战03-控件(3-文本控件及列表控件) WPF进阶技巧和实战03-控件(4-基于范围的控件及日期控件) WPF进阶技巧和实战03-控件(5-列表.树.网格01) WPF进阶技巧和实战03-控件(5-列表.树.网格02) WPF进阶技巧和实战03-控件(5-列表.树.网格03) WPF进阶技巧和实战0…
理解路由事件 当有意义的事情发生时,有对象(WPF的元素)发送的用于通知代码的消息,就是事件的核心思想.WPF通过事件路由的概念增强了.NET事件模型.事件由允许源自某个元素的事件由另一个元素引发.例如:使用路由事件,来自工具栏按钮的单击事件可在被代码处理前上传到工具栏,然后上传到包含工具栏的窗口. 事件路由为在最合适的位置编写紧凑的.组织良好的用于处理事件的代码提供了灵活性.要使用WPF内容模型,事件路由是必须的,内容模型允许使用许多不同的元素构建简单元素,并且这些元素都拥有自己独立的事件集合…
ListView控件 ListView继承自简单的没有特色的ListBox,增加了对基于列显示的支持,并增加了快速切换视图或显示模式的能力,而不需要重新绑定数据以重新构建列表. ListView类继承自ListBox类,并使用View属性进行扩展(可以创建丰富的列表).通过两个样式来设置View,一个用于ListView控件,一个用于ListView控件的项. 使用GridView创建列 GridView类继承自ViewBase类,表示具有多列的列表视图,通过GridView.Columns集合…
完善和扩展标准控件的方法: 样式:可使用样式方便地重用控件属性的集合,甚至可以使用触发器应用效果 内容控件:所有继承自ContentControl类的控件都支持嵌套的内容.使用内容控件,可以快速创建聚集其他元素的复合控件(按钮变成图像按钮,列表变成图像列表) 控件模板:所有WPF控件都是无外观的,这意味着他们具有硬编码的功能,但是他们的外观是通过控件模板单独定义的.使用新的控件模板替代默认模板,可重新构建基本控件 数据模板:所有派生自ItemsControl的类都支持数据模板,通过数据模板可创建…
列表控件 ItemsControl为列表项控件定义了基本功能,下图是ItemsControl的继承关系: 在继承自ItemsControl类的层次结构中,还显示了项封装器(MenuItem.TreeVIewItem),因为这些项(类)可以包含自己的项集合(从而实现数控件和菜单的嵌套关系和层次结构).在继承表中没有ComboBoxItem和ListBoxItem没有出现,那是因为他们不需要包含项的子集合,所以也就不继承自ItemsControl类. ItemsControl类中雨格式化相关的属性:…
多点触控输入 多点触控输入和传统的基于比的输入的区别是多点触控识别手势,用户可以移动多根手指以执行常见的操作,放大,旋转,拖动等. 多点触控的输入层次 WPF允许使用键盘和鼠标的高层次输入(例如单击和文本改变)和低层次输入(鼠标事件和按键事件).多点触控输入同样应用了这种多层次的输入方式,WPF提供了3个独立的层次: 原始触控(raw touch):这是最低级的支持,可访问用户执行的每个触控.缺点是由应用程序负责将单独的触控消息组合在一起,并对他们进行解释.如果不准备识别标准触摸手势,反而希望创…
在01节中,研究了如何开发自定义控件,下节开始考虑更特殊的选择:派生自定义面板以及构建自定义绘图 创建自定义面板 创建自定义面板是一种比较常见的自定义控件开发子集,面板可以驻留一个或多个子元素,并且实现了特定的布局逻辑以恰当地安排子元素.常见的基本类型的面板:StackPanel.DockPanel.WrapPanel.Canvas,Grid,TabPanel,ToolBarPverflowPanel,VirtualizingPanel. 两步布局过程 每个面板都有相同的功能:负责改变子元素尺寸…
逻辑树和可视化树 System.Windows.LogicalTreeHelper System.Windows.Media.VisualTreeHelper 逻辑树类(LogicalTreeHelper)的方法 名称 说明 FindLogicalNode 根据名称查找特定元素,从指定的元素开始并向下查找逻辑树 BringIntoView 如果元素在可滚动的容器中,并且当前不可见,就将元素滚动到视图中 GetParent 获取指定元素的父元素 GetChildren 获取指定元素的子元素 理解模…
样式(style)是组织和重用格式化选项的重要工具.创建一系列封装某些细节的样式,然后通过属性来应用样式. 行为(behavior)是一款重用用户界面代码更有挑战性的工具.基本思想是:使用行为封装一些通用的UI功能.如果具有适当的行为,可使用一两行XAML标记将其附加到任何元素. 样式基础 样式就是可应用于元素的属性值集合.样式支持触发器,当属性发生变化时,可通过触发器改变控件的样式. 样式有5个重要属性: 属性 说明 Setters 设置属性值,自动关联事件处理程序的Setter对象或者Eve…
资源集合 每个元素都有Resources属性,该属性存储了一个资源字典集合(它是ResourceDictionary类的实例).资源集合可以包含任意类型的对象,并根据字符串编写索引. 每个元素既可以访问自己的资源集合中的资源,也可以访问所有父元素 的资源集合中的资源,所以一般将资源集合放在窗口级别或者应用程序级别. 资源的引用分为动态.静态.静态资源在首次创建窗口时一次性地设置完毕.动态资源,如果发生了改变,就会重新应用资源.一般在下列情况下才需要使用动态资源属性: 资源具有依赖系统设置的属性(…
数据模板 样式提供了基本的格式化能力,但是不管如何修改ListBoxItem,他都不能够展示功能更强大的元素组合,因为了每个ListBoxItem只支持单个绑定字段(通过DisplayMemberPath属性设置),不可能包含多个字段或者图像的富列表. 数据模板就是这样一个能够突破这个最大限制,允许组合使用来自绑定对象的多个属性,以特定的方式排列他们并显示简单字符串的高级样式. 数据模板是一个定义如何显示绑定的数据对象的XAML标记,有两类控件支持数据模板: 内容控件:通过ContentTemp…
所有控件都继承自System.Windows.Controls.Control类,这个类添加一些基本结构: 设置控件内容对齐方式 (HorizontalContentAlignment,VerticalContentAlignment,Padding) 设置Tab键顺序 (TabIndex,IsTabStop) 绘制背景,前景,边框 (Background,Foreground,BorderBrush,BorderThickness) 支持格式化文本内容的尺寸和字体 (FontFamily,Fo…
Svg在WPF中的使用 方法1:拷贝svg中的部分代码转换成Geometry(作为Path的Data使用) 在vs或者直接打开svg,看到如下代码: <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&qu…
ScrollViewer控件 直接继承ContextControl类,提供了虚拟界面,允许用户围绕更大的元素滚动.只能包含单个元素(ContextControl决定),但可以放置布局控件来实现多个任意元素的放置. 默认是垂直滚动,也支持水平滚动功能(需要将HorizontalScrollBarVisibility改成Visible或者Auto).可以通过鼠标操作滚动或者代码来滚动内容: LineUp()和LineDown(),这两个方法向上和向下移动的效果相当于单击一次垂直滚动条两端的箭头按钮…
数据视图 数据视图是在后台工作的,用于协调绑定数据的集合.使用数据视图可以添加导航逻辑.实现数据过滤.排序.分组. 当将集合或者DataTable绑定到ItemsControl控件时,会不加通告地在后台创建数据视图(位于数据源和绑定的控件之间).数据视图是进入数据源的窗口,可以跟踪当前项,并且支持各种功能(排序.过滤.分组等).这些功能和数据对象本身是相互独立的,这意味着可以在窗口的不同部分使用不同的方式绑定相同的数据源.例如:可将同一产品集合绑定到两个不同的列表,并对产品进行过滤显示不同的记录…
窗体 无边框 窗体无边框(最大化及标题位置)WindowStyle="None" 窗体透明 AllowsTransparency="True",必须设置窗体无边框,否则报错 SizeToContent属性,窗体大小可以根据内容自动调整,多语言版本时一般会使用 我习惯性的设置Window窗体的样式如下: <Border Margin="5" Background="#EEE" CornerRadius="5&qu…
依赖属性和普通属性相比节省内存的原因:对于普通属性,每个对象有需要存储一个普通属性的值,即便是默认值.而依赖属性的默认值是静态的存储在类中的,所有对象都使用同一默认值,所以对于拥有大量属性的控件来说这就大大减少了内存的消耗.而对于非默认值,是有依赖属性所在的DependencyObject中的一个字典保存的,字典的key就是依赖属性,value就是依赖属性的值. 绑定的实现原理:这里说一下思路,DependencyObject中拥有一个字典保存绑定信息,字典的key是依赖属性,value为绑定的…
原文:wpf控件开发基础(5) -依赖属性实践 知识回顾 接上篇,回顾这三篇讲了什么东西 首先说明了属性的现存问题,然后介绍了依赖属性的基本用法及其解决方案,由于依赖属性以静态属性的方式存在,进而又介绍了可重写的属性元数据的使用.这是以上三篇所说明的问题.当然依赖属性的特性依然没有说完整.这两天也一直在想依赖属性,然后就是头疼,呵呵.由于WPF的依赖属性系统与整体功能都有关联,所以接下来等讲到某个特性的时候然后再来讲依赖属性.这篇我们来个简单的实践,增加点乐趣. 定义RadioButtonLis…
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,000 Things You Should Know About WPF .他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识.Follow他的博客也有一段日子了,很希望能够分享给大家. 本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解.本系列我希望自己…
前一阵子由于个人生活原因,具体见上一篇,耽搁了一阵子,在这里也十分感谢大家支持和鼓励.现在开始继续做WPF2000系列. 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,000 Things You Should Know About WPF .他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识.Follow他的博客也有…
依赖属性 ".NET properties are nothing more than syntactic sugar over set and get methods." 我们知道.NET的属性只不过是get/set方法的语法糖衣. "Dependency properties are the workhorse of WPF. This infrastructure provides for many of WPF's features, such as data bin…
六.依赖属性回调.验证及强制值 我们通过下面的这幅图,简单介绍一下WPF属性系统对依赖属性操作的基本步骤: 借用一个常见的图例,介绍一下WPF属性系统对依赖属性操作的基本步骤: 第一步,确定Base Value,对同一个属性的赋值可能发生在很多地方.比如控件的背景(Background),可能在Style或者控件的构造函数中都对它进行了赋值,这个Base Value就要确定这些值中优先级最高的值,把它作为Base Value. 第二步,估值.如果依赖属性值是计算表达式(Expression),比…
二. 依赖属性的优先级 由于WPF 允许我们可以在多个地方设置依赖属性的值,所以我们就必须要用一个标准来保证值的优先级别.比如下面的例子中,我们在三个地方设置了按钮的背景颜色,那么哪一个设置才会是最终的结果呢?是Black.Red还是Azure呢? <Window x:Class="WpfApp1.WindowDepend" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xm…
学习WPF时,我在看一本叫做“深入浅出WPF”的书.整整20页都在讲依赖性性和附加属性,反复看了几遍居然还是不懂,真是郁闷. 上一篇中WPF绑定的例子,其实已经用到了依赖属性. // 作为被绑定的目标类,必须从DependencyObject派生 // 这样定义的类才能满足SetBinding方法的第一个参数的类型要求 // 还要额外定义一个依赖属性,用来满足SetBinding方法的第二个参数要求 // 用DependencyObject派生方法GetValue和SetValue,控制属性的存…
依赖属性相当于扩充了 WPF 标签的原有属性列表,并可以使用 WPF 的绑定功能,可谓是十分方便的:用户控件则相当于代码重用的一种方式:以上几点分开来还是比较好理解的,不过要用到MVVM 模式中,还是要探索一番的. 我们先新建一个用户控件(UC_FoodsPanel.xaml),里面放一个 StackPanel:           XHTML   <UserControl x:Class="Note.UC_FoodsPanel" xmlns="http://schem…
正常定义的以来属性,在XAML里设置值得时候是不触发Setter的,只能在code中用. 监听PropertyChangedCallback事件可以感知XAML里的设置,这样才能code和XAML配合使用.http://stackoverflow.com/questions/5644081/wpf-usercontrol-dependency-property-setter-not-triggering http://msdn.microsoft.com/zh-cn/library/vstudi…