WPF基础架构

本文介绍了WPF的基本结构,包括元素系统、逻辑树与可视化树的区别、属性系统、XAML语言、Application对象、窗口对象的三层结构以及命令和触发器。重点讨论了改变通知、属性存储、表达式、XAML的声明式特性和命令的使用。

先介绍下WPF的整个基本结构:

元素系统是构成用户界面的核心内容,例如样式、布局、控件、绑定等等。这些都继承自System.Windows.FrameworkElement类。System.Windows.FrameworkElement类的父类是System.Windows.UIElement类。

逻辑树的顶级继承自System.Windows.Window类,System.Windows.Window类又继承自System.Windows.Controls.Panel类,主要用于排列布局。逻辑树的下一层级是System.Windows.Controls.Stackpanel,该类继承自panel.Stackpanel,它的实例控件都是在一个平面水平线上的。再下一层就是可视化控件了,比如图示中System.Windows.Controls.Label等。

可视化树支持程序元素的组合与可视化元素的创建。如图:

通过这么对比,我们应该能分清逻辑树与可视化树的区别。可以粗略理解为逻辑树就是逻辑底层,可视化树就是在这个逻辑上的界面布局。

我们接着来介绍下属性系统,我觉得这个比较重要点。

一个属性系统主要由改变通知、存储和表达式这三个主要组件构成。

改变通知:这是我们常常会用到的,就是我们可以监控到到哪个属性值发生了改变。主要是通过实现System.ComponentModel.INotifyPropertyChanged接口获得。这个接口只有一个成员——PropertyChanged事件。但是有个缺点,就是你必须要对监控的属性值做处理,假处理空处理都行,但是一定要写代码做处理。

存储:在WPF元素内支持扩展属性,就需要创建大量的存储器,因为每个元素都可能包含许多属性。

表达式:如Value =“12”、<Style TargeType ="{x:Tpye Button}">

 

下面来介绍下WPF中的一个最显著的特征——XMAL标记语言

XAML是一种声明式语言。有声明式和命令式两种形式,集成了动画、音频、视频和图像。使UI与逻辑分离,因为在XAML中只会声明UI元素,实际的逻辑代码只会是在映射的.xaml.csd的后代代码文件中编写。XAML支持WPF的渲染引擎,WPF图像引擎是基于向量的,所以允许根据具体的坐标去定位元素。就算你没有根据坐标定位元素也没关系,XAML提供的嵌套关系也能让元素定位显示。

 

接着介绍Application对象

WPF程序中都一定会有Application对象,它会在应用系统和操作系统之间提供一个接口,所以可以说APPlication对象就是WPF应用程序的一个入口,在里面你可以进行初始化操作。

①、创建Application对象的引用,并在页面之间创建一个共享数据的环境,之后就可以访问Application的非静态成员了。

Application myApp;
myAPP = System.windows.Application.Current;

②、共享信息,这是Application对象的一个基本功能。例如将类变为Application的属性:

# 先定义一个类
public class Book
{
    public decimal price;
    public string title;
    public string author;
}

class Window1
{
    pubulic window1()
    {
        InitializeComponent();
        Book book = new Book();
        book.author = “观音大士”;
        book.title = “如何成佛”;
        book.price= (decimal)0.9;
        
        Application.Current.Properties{"Book"} = book;
    } 
}

# 接着提取变量后,就可以将对象的一个属性来访问就好
private void MyClickEvent(object sender,RoutedEventArgs e)
{
    // 这个book1不是new 的BOOK对象,而是被赋值为Application中属性为BOOK的值
    Book boook1 = (Book)Application.Current.Properties{"Book"};
 }

 

接着介绍WPF中的窗口对象的三个层次

①、window

②、NavigationWindow

③、page

window对象提供了属性、方法和事件。就是我们最常见的,可以通过设置Application对象的MainWindow属性来为其指定主窗口。

要注意如果这个窗口是由线程创建的,那么这个窗口就不能加入到Application的窗口集合中,并且也不能通过Application对象来访问。你要理解为线程创造的其实是别的平行世界的产物,你不能在现实世界中去利用它。

NavigationWindow是针对导航应用程序设计的,并继承自Window基类。它提供了几种功能:在XMAL页面之间导航;保存和管理导航记录的历史跟踪机制;通过Navigation对象编程访问窗口的各种成员。

page对象被用作访问Navigation对象的一种替换手段。它提供了几点内容:由FrameworkElement引发的事件,例如Loadcd事件;窗口尺寸所特有的属性;描述窗口外观的属性,例如标题、标题字体、背景颜色及透明程度等。

 

接着介绍下WPF中的——命令

命令(Commands)是实现共享动作的一种手段,在应用程序中这些动作可以被分组并且可以以几种不同的方式触发。命令和事件的基本区别是命令不与控件相关,因为许多元素将调用命令。当一个命令被调用时,下传和上传事件将被引发,因为命令可以在应用程序或程序逻辑的任何地方被调用,所以需要为执行的命令做一些上下文准备工作。CommandBuding类用于为在窗口或应用程序中的命令执行提供特定用户界面元素的上下文。

CommandBuding实际上一共提供了四个事件:Execute、PreviewExecute、QueryEnabled和PreviewQueryEnabled。

上个代码理解下命令,定义一个当用户按下Shfit+Control+G的时候执行特定的操作。

# 先声明一个静态命令对象
public static RoutedCommand myCmd;

# 创建一个InputGestureCollection变量
static Window1()
{
    InputGestureCollection myInputs = new InputGestureCollection();

    #添加输入动作项目
    myInputs.Add(new KeyGesture(Key.G, ModifierKeys.Control | ModifierKeys.Shfit));
    myCmd = new RoutedCommand("GO",typeof(Window1), myInputs);
}

# 激活一个命令
private void ExecuteCommandClickEvent(object sender, RoutedEventArgs e)
{
    myCmd.Execute(sender,null)
}

 

接着讲——触发器,触发器有6种类型,我们将挨个讲解:

①、属性触发器

②、事件触发器

③、数据触发器

④、多条件数据触发器

⑤、多触发器

⑥、多条件触发器

属性触发器:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值