WPF开发基础
WPF(Windows Presentation Foundation) 是微软基于 .NET 的桌面 UI 框架,用 XAML 声明式语言 + 数据绑定 + MVVM 模式构建界面。下面按学习路径梳理核心内容:
1. 核心架构思想#
XAML(界面外观描述)
↕ 数据绑定(Data Binding)
C# 代码(业务逻辑)plaintext与传统 WinForm 最大的区别:界面与逻辑解耦,尽量不直接在后台代码里操作控件。
2. XAML 基础#
<Window x:Class="Demo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="主窗口" Width="400" Height="300">
<Grid>
<Button Content="点击" Click="Btn_Click"
Width="100" Height="30"/>
</Grid>
</Window>xml- 每个 XAML 元素对应一个 .NET 对象
x:Name给控件起名以便代码访问- 属性可在 XAML 中直接设置,也可通过样式/模板统一控制
3. 布局容器(重要)#
| 容器 | 特点 |
|---|---|
Grid | 行列网格布局(最常用,类似 HTML 表格) |
StackPanel | 水平或垂直堆叠 |
WrapPanel | 空间不足自动换行 |
DockPanel | 靠边缘停靠 |
Canvas | 绝对坐标定位 |
原则:少用 Margin 硬定位,多用容器自动布局。
4. 数据绑定(WPF 的灵魂)#
<TextBox Text="{Binding UserName, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="{Binding Age, StringFormat='年龄:{0}'}" />xmlpublic class User : INotifyPropertyChanged
{
private string _userName;
public string UserName
{
get => _userName;
set { _userName = value; OnPropertyChanged(nameof(UserName)); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}csharpDataContext:绑定的数据源(通常在窗口或控件上设置)INotifyPropertyChanged:属性变化时通知界面刷新
5. 依赖属性(Dependency Property)#
WPF 控件的属性大多是依赖属性,支持绑定、动画、样式:
public static readonly DependencyProperty TitleProperty =
DependencyProperty.Register("Title", typeof(string), typeof(MyControl),
new PropertyMetadata("默认值"));csharp自定义控件时需要掌握,日常开发主要会用即可。
6. 事件与命令#
- 事件:按钮 Click、鼠标 MouseDown 等(与 WinForm 类似)
- 路由事件:事件可沿可视化树冒泡/隧道(Preview 前缀),如
PreviewMouseDown - 命令(Command):解耦事件处理逻辑,MVVM 中代替事件
<Button Content="保存" Command="{Binding SaveCommand}" />xml7. MVVM 模式(WPF 最佳实践)#
View(XAML) ←数据绑定→ ViewModel(逻辑,不引用控件)
↑
Model(数据/业务)plaintext- View:纯界面
- ViewModel:实现
INotifyPropertyChanged,暴露属性和ICommand - Model:数据实体(如前面的 User 类)
常用库:CommunityToolkit.Mvvm(微软官方轻量 MVVM 库,Source Generator 自动生成通知代码)
8. 常用主题#
- 样式(Style)/ 资源(Resource)/ 资源字典:统一定制控件外观
- 模板(ControlTemplate / DataTemplate):完全重写控件结构 / 定义数据如何展示(如 ListBox 每一项长什么样)
- 触发器(Trigger / DataTrigger):条件改变时自动切换样式
- 线程:
Dispatcher.Invoke()跨线程更新 UI