avatar

目錄
WPF学习笔记(一)入门基础

WPF学习笔记(一)入门基础

一、WPF概述

为Windows创建具有视觉效果的用户体验的桌面客户端应用程序

WPF通过一系列全面的应用程序开发功能扩展了核心,这些功能包括可扩展应用程序标记语言(XAML),控件,数据绑定,布局,2D和3D图形,动画,样式,模板,文档,媒体,文本和版式

1. WPF项目生成的项目文件结构

打开Visual Studio2019 创建“WPF应用程序”,默认生成的文件结构如下图:

文件结构

在App.xaml中的“StartupUri”属性可以指定项目运行时的启动窗体。还可以定义我们需要的系统资源以及引入程序集等如下图:

2. 命名空间

在许多 XAML 文件的根标记中的命名空间声明内,通常可看到两个 XML 命名空间声明。 第一个声明默认映射整个 WPF 客户端/框架 XAML 命名空间:默认是没有前缀的

Code
1
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

第二个声明映射单独的 XAML 命名空间,(通常)将其映射到 x: 前缀。

Code
1
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

2.1 x:Class

这个Attribute作用是告诉XAML编译器将XAML标签的编译结果与后台代码中指定的类合并,在使用x:Class时必须遵循以下要求:

  • 这个Attribute只用于根节点
  • 使用x:Class的根节点的类型要与x:Class的值所指示的类型保持一致
  • x:Class的值所指示的类型在声明时必须使用partial关键字

2.2 x:ClassModifier

这个Attribute作用是告诉XAML编译由标签生成的类具有怎么样的访问控制级别.使用x:ClassModifier时需要注意事项:

  • 标签必须具有 x:Class Attribute
  • x:ClassModifier的值必须与x:Class所指示类的访问控制级别一致
  • x:ClassModifier的值随后台代码的编译语言不同而有所不同,具体参看TypeAttributes枚举类型

2.3 x:Name

XAML标签是对象,一个XAML变迁对应着一个对象,这个对象一般是一个控件的实例。
不带名称的XAML对象声明只负责声明对象而不负责为这些对象声明引用变量。
如果我们需要为对象准备一个引用变量以便在C#代码中直接访问就必须显示告诉XAML编译器,为这个对象声明引用变量就要用到x:Name

x:Name的作用有两个:

  • 告诉XAML编译器,当一个标签带有x:Name时除了为这个标签生成对应实例以外还要为这个实例声明一个引用变量,变量名就是x:Name的值
  • 将XAML标签所对应对象的Name属性(如果有)也设置为x:Name的值,并把这个值注册到UI树上以方便查找

Tips:在XAML代码中应该使用Name还是x:Name
Name属性定义在FrameworkElement类中,这个类是WPF控件类的基类,所有的WPF控件都有Name这个属性。当一个元素具有Name属性时,使用Name或者x:Name效果是一样的。对于那些没有Name属性值的元素,为了在XAML声明时也创建引用变量以便在C#代码中访问,我们只能使用x:Name。

2.4 x:FieldModifier.

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

  • 使用x:Name后XAML标签对应实例具有自己的引用变量,而且这些引用变量都是类的字段。默认情况下,这些字段的访问级别按照面向对象的封装原则被设置成internal。有时候我们需要从一个程序集访问另外一个程序集中窗体的元素,这个时候需要把访问控件的引用变量改为public级别。

注意:因为x:FieldMOdifier是用来改变引用变量访问级别的,所有使用x:FieldModifer的前提是这个标签同时使用x:Name,否则无法通过Name来引用变量。

二、WPF中的XAML

  1. XAML是基于XML的声明性标记语言,作为编程代码实例化和初始化对象
  2. Xamarin.Forms 开发人员可以定义用户界面用作所有 Xamarin.Forms 视图、 布局和页面,以及自定义类。 可以编译或可执行文件中嵌入的 XAML 文件

1. XAML的优缺点

(1)优点:

  • 更简洁和可读性
  • XML中固有的父-子层次结构
  • 可以轻松手动编写,也可以通过可视化设计工具生成

(2)缺点

  1. XAML 不能包含代码。 必须在代码文件中定义所有事件处理程序。
  2. XAML 不能包含重复处理的循环。 (但是,最值得注意的是 ListView 可以生成多个子级中的对象基于其 ItemsSource 集合。)
  3. XAML 不能包含有条件处理(但是,数据绑定可以引用,可有效地处理某些条件的代码基于绑定转换器。
  4. XAML 通常无法实例化类未定义无参数构造函数。(但是,有时会解决此限制问题的方法。)
  5. XAML 通常不能调用方法。(同样,此限制可以有时克服。)

2. 为对象属性赋值的方式

  • 利用Attribute=value的形式

    Code
    1
    2
    3
    4
    //直接写在标签内
    <Button Width="120" Height="30" Grid.Row="3" >
    <Rectangle Width="20" Height="20" Stroke="DarkBlue" Fill="LawnGreen" />
    </Button>
  • 属性标签的形式

    Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <Window.Resources>
    <style>
    ...
    </style>
    </Window.Resources>
    //
    <Grid>
    <Grid.ColumnDefinitions>
    <ColumnDefinition />
    </Grid.ColumnDefinitions>
    </Grid>
  • 标签扩展

    Code
    1
    2
    <TextBlock x:Name="tb" Text="{Binding ElementName=sld,Path=Value}" />
    <Slider x:Name="sld" Grid.Row="4" Value="50" Maximum="100" Minimum="0" />

三、学习中…

链接…

  1. 刘铁猛老师教学视频:https://www.bilibili.com/video/av38367210?from=search&seid=17560756528935135904
文章作者: Dylan
文章鏈接: https://www.faithlch.com/WPF%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E4%B8%80-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80.html
版權聲明: 本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Dylan He
打賞
  • 微信
    微信
  • 支付寶
    支付寶

評論