看一个例子,FontFamily="Trebuchet MS, GlobalSansSerif.CompositeFont" .这样一条简单的语句,熟悉WPF的人在xaml中可能经常使用.问题是为什么,WPF能将一个string类型的值,赋值给FontFamily类型. 答案:WPF团队在实现XAML语言的时候,为了使用户能像使用HTML语法一样方便,在WPF中集成了很多的转换器,它们能将String值转化为各种类型,赋值给Control的各个属性. 进一步讨论,本人使用C#4年,WP…
上一章WPF进阶之接口():INotifyPropertyChanged,ICommand中我们遗留了几个问题,我将在本节中做出解释.在详细解释ICommand实现之前,我们现在关注一下什么是:弱引用(WeakReference) 弱引用: 表示弱引用,即在引用对象的同时仍然允许垃圾回收来回收该对象. 如果应用程序的代码可以访问一个正由该程序使用的对象,垃圾回收器就不能收集该对象,那么,就认为应用程序对该对象具有强引用. 弱引用允许应用程序访问对象,同时也允许垃圾回收器收集相应的对象.如果不存在…
INotifiPropertyChanged . 作用:向客户端发出某一属性值已更改的通知.该接口包含一个PropertyChanged事件成员(MSDN的解释) INotifyPropertyChanged 接口用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知. 例如,考虑一个带有名为 FirstName 属性的 Person 对象.若要提供一般性属性更改通知,则 Person 类型实现NotifyPropertyChanged 接口并在 FirstName 更改时引发 Pro…
废话不多说,进入正题,先来说说IDisposable,看例子(来自MSDN): using System; using System.ComponentModel; // 下面的例子将展示一个实施了IDisposable接口和Dispose方法的类 public class DisposeExample { public class MyResource: IDisposable { // 指针,指向非托管资源. private IntPtr handle; //类,托管资源. private…
原文:WPF使用IDataErrorInfo接口进行数据校验 - 简书 class ValidationBindableBase : BindableBase, IDataErrorInfo { public string this[string columnName] { get { if (_errorMap.ContainsKey(columnName)) { var error = _errorMap[columnName]; _errorMap.Remove(columnName);…
原文:WPF进阶教程 - 使用Decorator自定义带三角形的边框 写下来,备忘. Decorator,有装饰器.装饰品的意思,很容易让人联想到设计模式里面的装饰器模式.Decorator类负责包装某个UI元素,用来提供额外的行为.它有一个类型为UIElement的Child属性,其中含有待包装的内容.Decorator可以被用于添加简单的视觉装饰,比如Border边框,或者更为复杂的行为,比如ViewBox.AdornerDecorator.        当我们继承Decorator时,也…
系列文章链接 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中将控件绑定到对象的属性时, 当对象的属性发生改变时必须通知控件作出相应的改变, 所以此对象需要实现 INotifyPropertyChanged 接口 例: //实现属性变更通知接口 INotifyPropertyChanged public class TestA : INotifyPropertyChanged { public long ID { get; set; } private string name; public string Name { get { return…
完善和扩展标准控件的方法: 样式:可使用样式方便地重用控件属性的集合,甚至可以使用触发器应用效果 内容控件:所有继承自ContentControl类的控件都支持嵌套的内容.使用内容控件,可以快速创建聚集其他元素的复合控件(按钮变成图像按钮,列表变成图像列表) 控件模板:所有WPF控件都是无外观的,这意味着他们具有硬编码的功能,但是他们的外观是通过控件模板单独定义的.使用新的控件模板替代默认模板,可重新构建基本控件 数据模板:所有派生自ItemsControl的类都支持数据模板,通过数据模板可创建…
数据视图 数据视图是在后台工作的,用于协调绑定数据的集合.使用数据视图可以添加导航逻辑.实现数据过滤.排序.分组. 当将集合或者DataTable绑定到ItemsControl控件时,会不加通告地在后台创建数据视图(位于数据源和绑定的控件之间).数据视图是进入数据源的窗口,可以跟踪当前项,并且支持各种功能(排序.过滤.分组等).这些功能和数据对象本身是相互独立的,这意味着可以在窗口的不同部分使用不同的方式绑定相同的数据源.例如:可将同一产品集合绑定到两个不同的列表,并对产品进行过滤显示不同的记录…
数据模板 样式提供了基本的格式化能力,但是不管如何修改ListBoxItem,他都不能够展示功能更强大的元素组合,因为了每个ListBoxItem只支持单个绑定字段(通过DisplayMemberPath属性设置),不可能包含多个字段或者图像的富列表. 数据模板就是这样一个能够突破这个最大限制,允许组合使用来自绑定对象的多个属性,以特定的方式排列他们并显示简单字符串的高级样式. 数据模板是一个定义如何显示绑定的数据对象的XAML标记,有两类控件支持数据模板: 内容控件:通过ContentTemp…
将元素绑定在一起 数据绑定最简单的形式是:源对象是WPF元素而且源属性是依赖项属性.依赖项属性内置了更改通知支持,当源对象中改变依赖项属性时,会立即更新目标对象的绑定属性. 元素绑定到元素也是经常使用的,可以使元素的交互自动化,而不必编写代码. 绑定表达式 Visibility="{Binding Path=IsChecked, ElementName=rdKer, Converter={StaticResource EqualVisibleConverter}, ConverterParame…
数据提供者 在大多数的代码中,都是通过设置元素的DataContext属性或者列表控件的ItemsSource属性,从而提供顶级的数据源.当数据对象是通过另一个类构造时,可以有其他选择. 一种是作为窗口的资源定义数据对象.如果能够使用声明的方式构造对象,这种方法工作的很好,但是如果需要在运行时使用数据库等方式获取数据,这种技术就没有意义了.但是会出现部分开发人员采用这种方法,基本思路是在构造函数中获取所需的数据. <Window.Resources>     <local:PhotoLi…
理解路由事件 当有意义的事情发生时,有对象(WPF的元素)发送的用于通知代码的消息,就是事件的核心思想.WPF通过事件路由的概念增强了.NET事件模型.事件由允许源自某个元素的事件由另一个元素引发.例如:使用路由事件,来自工具栏按钮的单击事件可在被代码处理前上传到工具栏,然后上传到包含工具栏的窗口. 事件路由为在最合适的位置编写紧凑的.组织良好的用于处理事件的代码提供了灵活性.要使用WPF内容模型,事件路由是必须的,内容模型允许使用许多不同的元素构建简单元素,并且这些元素都拥有自己独立的事件集合…
1.go语音之进阶篇 示例: package main import "fmt" type Humaner interface { //子集 sayhi() } type Personer interface { //超集 Humaner //匿名字段,继承了sayhi() sing(lrc string) } type Student struct { name string id int } //Student实现了sayhi() func (tmp *Student) sayhi…
1.接口的继承 示例: package main import "fmt" type Humaner interface { //子集 sayhi() } type Personer interface { //超集 Humaner //匿名字段,继承了sayhi() sing(lrc string) } type Student struct { name string id int } //Student实现了sayhi() func (tmp *Student) sayhi()…
1.接口的定义和实现以及接口的继承 示例: package main import "fmt" //定义接口类型 type Humaner interface { //方法,只有声明,没有实现,由别的类型(自定义类型)实现 sayhi() } type Student struct { name string id int } //Student实现了此方法 func (tmp *Student) sayhi() { fmt.Printf("Student[%s, %d] s…
setting.py MYSQL_HOST='192.168.127.139' PASSWORD=' PORT=3306 USER='root' DB='stu' tools.py import pymysql,redis from conf import setting def op_mysql(sql): conn=pymysql.connect(host=setting.MYSQL_HOST,user=setting.USER, passwd=setting.PASSWORD, port=…
一.基本概念 1.接口为引用数据类型,编译后也是class字节码文件 2.接口是完全抽象的,(抽象类是半抽象的),属于特殊的抽象类 3.接口定义方法:[修饰符列表]interface 接口名{} 4.接口所有元素都是public公开的 5.接口中的public abstract修饰符是可以省略的 6.接口中的抽象方法是不能有方法体的 7.接口中的常量的public static final是可以省略的 8.实现使用implements关键字完成,接口与类之间叫做实现 9.类可以实现多个接口,类似…
一.INotifyPropertyChanged 的基本概念 ​ INotifyPropertyChanged 的作用:通知客户端属性值已经更改.详细信息见:INotifyPropertyChanged 接口(Microsoft).实现接口如下图: ​ 二.优化 INotifyPropertyChanged 接口实现 ​ 优化后的 INotifyPropertyChanged 接口实现类如下所示: 1 class NofifyPropertyChanged : INotifyPropertyCh…
一.概要 本系列将继<.net wpf快速入门教程>带领大家了解wpf,帮助各位在初级向中级过渡的中掌握基本该具备的能力.本系列视频长度大约在15分钟到30分钟左右,视频内容不仅仅会讲解技能还会分享面试中常见的问题. 二.详细内容 以下是视频的播放地址: https://www.bilibili.com/video/BV1S5411c7Bo 整套视频一共有19期: [简言]向大家介绍本系列的基本内容以及后续规划. [自定义控件],1.自定义控件概念讲解 2.自定义控件库如何使用. [依赖项属性…
依赖项属性 定义依赖项属性 注意:只能为依赖对象(继承自DependencyObject的类)添加依赖项属性.WPF中的元素基本上都继承自DependencyObject类. 静态字段 名称约定(属性末尾加上Property) Readonly(只能在静态构造函数中进行设置) public static readonly DependencyProperty ScalingRatioProperty = DependencyProperty.Register("ScalingRatio"…
在01节中,研究了如何开发自定义控件,下节开始考虑更特殊的选择:派生自定义面板以及构建自定义绘图 创建自定义面板 创建自定义面板是一种比较常见的自定义控件开发子集,面板可以驻留一个或多个子元素,并且实现了特定的布局逻辑以恰当地安排子元素.常见的基本类型的面板:StackPanel.DockPanel.WrapPanel.Canvas,Grid,TabPanel,ToolBarPverflowPanel,VirtualizingPanel. 两步布局过程 每个面板都有相同的功能:负责改变子元素尺寸…
逻辑树和可视化树 System.Windows.LogicalTreeHelper System.Windows.Media.VisualTreeHelper 逻辑树类(LogicalTreeHelper)的方法 名称 说明 FindLogicalNode 根据名称查找特定元素,从指定的元素开始并向下查找逻辑树 BringIntoView 如果元素在可滚动的容器中,并且当前不可见,就将元素滚动到视图中 GetParent 获取指定元素的父元素 GetChildren 获取指定元素的子元素 理解模…
列表控件 ItemsControl为列表项控件定义了基本功能,下图是ItemsControl的继承关系: 在继承自ItemsControl类的层次结构中,还显示了项封装器(MenuItem.TreeVIewItem),因为这些项(类)可以包含自己的项集合(从而实现数控件和菜单的嵌套关系和层次结构).在继承表中没有ComboBoxItem和ListBoxItem没有出现,那是因为他们不需要包含项的子集合,所以也就不继承自ItemsControl类. ItemsControl类中雨格式化相关的属性:…
所有控件都继承自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…
多点触控输入 多点触控输入和传统的基于比的输入的区别是多点触控识别手势,用户可以移动多根手指以执行常见的操作,放大,旋转,拖动等. 多点触控的输入层次 WPF允许使用键盘和鼠标的高层次输入(例如单击和文本改变)和低层次输入(鼠标事件和按键事件).多点触控输入同样应用了这种多层次的输入方式,WPF提供了3个独立的层次: 原始触控(raw touch):这是最低级的支持,可访问用户执行的每个触控.缺点是由应用程序负责将单独的触控消息组合在一起,并对他们进行解释.如果不准备识别标准触摸手势,反而希望创…
样式(style)是组织和重用格式化选项的重要工具.创建一系列封装某些细节的样式,然后通过属性来应用样式. 行为(behavior)是一款重用用户界面代码更有挑战性的工具.基本思想是:使用行为封装一些通用的UI功能.如果具有适当的行为,可使用一两行XAML标记将其附加到任何元素. 样式基础 样式就是可应用于元素的属性值集合.样式支持触发器,当属性发生变化时,可通过触发器改变控件的样式. 样式有5个重要属性: 属性 说明 Setters 设置属性值,自动关联事件处理程序的Setter对象或者Eve…