1.初识WPF

1.初识WPF

初识WPF

VS中项目目录

  • Properties:里面主要放一些用到资源如图片等
  • References:引用了哪些项目或者哪些类库
  • App.xaml:程序主体,声明了主窗体是谁,类似于winform下program.cs文件。该分支下还有一个App.xaml.cs文件,这是后台代码
  • MainWindow.xaml:主窗口

剖析XAML代码

XAML由XML派生而来,很多XML中的概念都可以直接使用。

  • 非空标签 <Tag Attribute=value>content</Tag>
  • 空标签<Tag Attribute=value/>

XAML是一种声明式语言,一个标签就代表一个对象,对象之间可以是并列或者包含。

一般将标签式语言中的标签特征—“名称=值”—称作是Attribute,但如果使用该标签语言进行面向对象编程时,面向对象中的Property很容易与之混淆。实际上,标签的Attribute只是和对象的Property做了一个映射。一般标签的Attribute要多于它所代表对象的Property。

1
2
3
4
5
6
7
8
9
10
11
12
13
<!--这些都是Window的Attribute-->
<Window x:Class="WpfApp2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp2"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800"> <!--和Window对象的属性相对应-->
<Grid>

</Grid>
</Window>

XAML语言使用xmlns来定义名称空间xmlns[:可选的映射前缀(名称空间别名)]="名称空间"。没有映射前缀的名称空间为默认名称空间,只能有一个,应把最常用的名称空间设置为默认名称空间。

上面案例中,<Window><Grid>都是来自默认的名称空间,第一行中x:Class则来自第三行中x前缀对应的名称空间。

案例:如果把第二行中的xmlns改为xmlns:n则需要将代码改为这样才行

1
2
3
4
5
6
7
<n:Window x:Class="WpfApp2.MainWindow"
xmlns:n="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
...
<n:Grid>

<n:/Grid>
<n:/Window>

XAML引用外来程序集: 1.添加对程序集的应用(与winform一样)2.在根元素起始标签上增加xmlns:x="clr-namespase:System.Windows.Controls; assembly=PresentationFramework"(这类似于C#使用using引用名称空间)

案例中默认引入的像链接一样的东西其实是XAML解析器的硬编码,代表着引入一系列程序集。winfx/2006/xaml/presentation对应绘制UI的程序集,winfx/2006/xaml对应着跟XAML编译有关的程序集。

x:Class="WpfApp2.MainWindow"x:说明该Attribute来自于x映射的命名空间。Class的作用是XAML解析器将标签解析成C#类后,这个类的类名是什么。

APP.xaml中StartupUri="MainWindow.xaml"表示启动窗体为MainWindow窗体。

思考

MainWindow.xaml中x:Class后面指定的类名和Mainwindow.xaml.cs中的类名是什么关系呢?

其实如果x:Class后面的类名和Mainwindow.xaml.cs不同,且将Mainwindow.xaml.cs中的InitializeComponent();注释掉,程序也可以展现出MainWindow.xaml设计的界面,因为APP.xaml中指定了StartupUri="MainWindow.xaml",只要是MainWindow.xaml是一个可执行的界面就可以运行展示。但不建议这样做的原因是如果两个类名不同,则在Mainwindow.xaml.cs中就不能使用xaml中所定义的组件(因为不是一个类),这样就不能实现前后端分离的目的。

作者

步步为营

发布于

2024-05-08

更新于

2025-03-15

许可协议