首页 > 生活

WPF

更新时间:2025-05-23 04:42:23 阅读: 评论:0

WPF 数据驱动程序运行,属于“内容决定形式”的思维方式

XAML(Extensible Application Markup Language),使用xmlns(XML Namespace的缩写)特征来定义命名空间,xmlns后可以跟一个可选的映射前缀,之间用冒号分割,第2~5行看起来像网页地址的名称空间是XAML解析器的一个硬性编码,只要见到这些固定的字符串,解析器就回把一系列必要的程序集(Assembly)和程序集中包含的.NET名称空间引用进来。

schemas.microsoft/winfx/2006/xaml/presentation对应的是与绘制UI相关的程序集,schemas.microsoft/winfx/2006/xaml对应XAML语言解析处理相关的程序集。

x:Class特征的作用是:当XAML解析器将包含它的标签解析成C#类后的类的类名。

属性元素:指的是某个标签的一个元素(子标签)对应这个标签的一个属性,即以元素的形式来表达实例的属性。

标记扩展:标记扩展实际上是一种特殊的Attribute=Value的语法,Value字符串是由一对花括号括起来的内容组成,XAML编译器会对这样的内容进行解析,生成相应的对象。

事件处理器:标签的Attribute一部分会对应这个对象的Property,还有一部分Attribute对应对象的事件,例如<Butto花园口决堤n>标签的有一个名为Click的Attribute,对应的就是Button类的Click事件。

代码后置:将逻辑代码和UI分离,.NET通过p抹香鲸atial关键字支持类分开定义,将解析XAML所生成的代码与x:Class所指的的类进行合并。

x:Code标签可将本应该保存在后置C#代码搬到XAML文件里:

x名称空间:x名称空间映射的是schemas.microsoft/winfx/2006/xaml,其中包白子含的类均与解析XAML语言相关,XAML会被解析编译形成微软中间语言存储在程序集中。

x名称空间中的Attribute:

x:Class 告诉XAML编译器将XAML标签的编译结果与C#后台代码指定的类贵州薏米合并

x:ClassModifier 告诉XAML编译器由XAML标签生成的类的访问控制纹身培训学校级别,其值应和x:Class指定的类的访问级别一致。

x:Name 告诉编译器标签对应实例的名称

x:FieldModifier 在XAML里改变变量访问级别

x:Key 在XAML里可以把需要多次使用的内容提取出来放在资源字典里,是要使用时使用Key进行检索

在后台C#代码中也可以使用该资源 string str =this.FindResource("myString") as string;

x:Shared 与x:Key配合使用,如果x:Shared设置为true,则每次检索资源对象是得到的是同一个对象,否则是对象的新副本。默认x:Shared值为true

x名称空间中的标记扩展:

x:Type 数据类型名称

x:Null 表示XAML中的空值

x:Array 通过其Items属性像使残阳如血用者提供一个类型已知的ArrayList实例,类型由x:Array的Type指明

x:Static 在XAML中使用数据类型的static成员

XAML标签的内容区域专门映射了控件的内容属性。我们把符合某类内容模型的UI元素称为一个族,每个族用其共同基类来命名。

ContentControl族:内容属性名称为Content,只能由单一元素充当其内容

HeaderedContentControl族:控件有一个内容区域和显示标题的区域,Content和Header都只能容纳一个元素。

ItemsControl族:用于显示列表化的数据,内容属性为Items或ItemsSource

HeaderedItemsContro大支事件l族:用于显示列表化的数据,同时显示一个标题。包括MenuItem,TreeViewItem和ToolBar

Decorator族:在UI上起装饰效果的,内容属性为Child,只能由单一元素充当其内容

TextBlock和TextBox: TextBlock只能显示文本,不能编辑,又称为静态文本,可以使用丰富的格式控制标记,内容属性为Inlines或Text;TextBox内容是简单的字符串,可编辑,内容属性为Text

Shape族:是简单的视觉元素不是控件,用于2D图形绘制,无内容属性

Panel族:派生自Panel抽象类,用于控制UI布局,内容属性为Children

Binding关联

Binding源是逻辑层的对象,目标是UI层的控件对象,从而实现数据驱动UI

class Student:INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string name; public string Name { get { return name; } set { name = value; if (PropertyChanged != null) { PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name")); } } } }private Student stu = new Student(); public MainWindow() { InitializeComponent(); this.textbox1.SetBinding(TextBox.TextProperty, new Binding("Name") { Source = stu = new Student() }); }

控制Binding数据流向的属性是Mode,其类型是BindingMode枚举,枚举值包括TwoWay,OneWay,OnTime,OneWayToSource和Default。Binding还有NotifyOnSourceUpdated和NotifyOnTragetUpdated两个bool类型的属性,如果设置为true,则当源或目标发生更新后Binding会激发相应的SourceUpdated事件和TargetUpdated360n7事件。

如果Binding源本身就是数据则不需要用Path来指明,例如string,int等基本类型,他们的实例本身就是数据,此时只需要将Path的值设置为“.”就可以了,在XAML中“.”可以省略不写,但在C#代码中则不能省略。

没有指定Source的Binding,使用DataContext作为Binding的源。DataContext属性定义在FrameworkElement类里,这个类是WPF控件的基类,当Binding未指定源时会沿着UI元素树一路向根部找过去,每路过一个结点就看看这个结点的DataContext是否具有Path所指定的串口设备属性。

依赖属性

依赖属性是一种可以自己没有值,能通过使用Bindscanfiling从数据源获得值的属性,拥有依赖属性的对象称为“依赖对象”。WPF中依赖对象的概念由DependencyObject类实现,依赖属性的概念由DependencyProperty类所实现,

public class Student:DependencyObject { public int Age { get { return (int)GetValue(AgeProperty); } set { SetValue(AgeProperty, value); } } // Using a DependencyProperty as the backing store for Age. This enables animation, styling, binding, etc... public static readonly DependencyProperty AgeProperty = DependencyProperty.Register("Age", typeof(int), typeof(Student), new PropertyMetadata(0)); //CLR属性包装器 public string Name { get { return才智杂志 (string)GetValue(NameProperty); } set { SetValue(NameProperty, value); } } //依赖属性 public static readonly DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Student)); //SetBinding包装 public BindingExpressionBase SetBinding(DependencyProperty dp,BindingBase binding) { return BindingOperations.SetBinding(this, dp, binding); 三星e1080 } }

在vs中输入propdp然后按两次Tab键,自动输入依赖属性。

DependencyProperty.Register()方法创建DependencyProperty实例并且对其进行“注册”。DependencyProperty类有一个名为PropertyFromName的全局哈希表,这个哈希表就是用来注册依赖属性的地方,hash code为第一个参数(CLR属性名字符串)的hash code与第三个参数(宿主类型)的hash code进行异或运算得到的。

DependencyProperty实例的哈希值为GlobalIndex属中华网军事论坛性值,即通过GlobalIndex属性值就可以检索到某个DependencyProperty实例。

附加属性(Attached Property)

把对象放入一个特定环境才具有的属性(表现出来就是被环境所赋予的属性)称为附加属性。附加属性的本质就是依赖属性,二者仅在注册和包装器上有一些区别,在VS中使用propa提示符快速创建附加属性。

clas个人注册域名s School: System.Windows.DependencyObject { 校直机public static int GetGrade(DependencyObject obj) { return (int)obj.GetValue(GradeProperty); } public static void SetGra立志小故事de(DependencyObject obj, int value) { obj.SetValue(Gr莞式服务图片adeProperty, value); } // Using a DependencyProperty as the backing store for Grade. This enables animation, styling, binding, etc... public static readonly DependencyProperty GradeProperty = DependencyProperty.RegisterAttached("Grade", typeof(int), typeof(School), new UIPropertyMetadata(0)); } class Human:DependencyObject { }//调用Human human = new Human();School.SetGrade(human, 6);int grade = School.GetGrade(human);事件

WPF中有两种“树”,一种叫做逻辑树(Logical Tree),一种叫做可视化树(Visual Tree).逻辑树完全由布局组件和控件构成,而Visual Tree则包括了控件的内部结构。为了降低传统.NET中由事件订阅带来的耦合度和代码量,WPF推出了路由事件机制,路由事件与直接事件的区别在于,直接事件激发时,事件发送者直接将消息通过事件订阅交给事件响应者,事件响应者利用其事件处理方法对事件做出响应。路由事件的事件拥有者和事件响应者之间没有显式的订阅关系,事件拥有者只负责激发事件,事件由谁响应它并不知道。事件响应者安装有时间侦听器,针对某类事件进行侦听。

this.stackpanel1.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click));private void Button_Click(object sender, RoutedEventArgs e){ MessageBox.Show((e.OriginalSource as FrameworkElement).Name); //事件的源头通过e.OriginalSource找到,而不是sender}

路由事件的消息包含在RoutedEventArgs实例中,RoutedEventArgs有两个属性Source和OriginalSource,这两个属性都表示路由事件传递的起点,只不过Source表示的是LogicalTree上的消息源头,而OriginalSource则表示VisualTree上的源头,

命令

WPF的命令系统由几个基本要素组成:

命令(Command):是实现了ICommand接口的类,使用的最多的是RoutedCommand类

命令源(Command Source):即命令的发送者,是实现了ICommandSource接口的类。

命令目标(Command Target):即命令发送给谁,是实现了IInputElement接口的类

命令关联(Command Binding):负责把一些外围逻辑和命令关联起来

资源

通过xmlns:sys="clr-namespace:System;assembly=mscorlib"引入System名称空间,

<Window.Resources> 铂金坩埚<sys:String x:Key="str"> hello world </sys:String> <sys:Double x:Key="dbl">3.1415926</sys:Double> </Window.Resources> <StackPanel x:Name="stackpanel1" HorizontalAlignment="Left" Height="100" Margin="82,45,0,0" VerticalAlignment="Top" Width="232"> <TextBox x:Name="textbox1" Height="23" TextWrapping="Wrap" Text="{StaticResource str}"/> &女用套lt;/StackPanel>

在C#代码中使用资源 string text =(string)this.FindResource("str");

在检索资源时,首先查找控件自己的Resources属性,如果没有这个资源程序会沿米粒网着逻辑树向上一级控件查找,如果连最顶级控件也没有这个资源,程序会去查找Application.Resources,如果还是没找到就抛出异常。

本文发布于:2023-06-04 07:01:22,感谢您对本站的认可!

本文链接:http://www.ranqi119.com/ge/85/214244.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:WPF
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 站长QQ:55-9-10-26|友情:优美诗词|电脑我帮您|扬州装修|369文学|学编程|软件玩家|水木编程|编程频道