======================================
WPF 基础
======================================
WPF(Windows Presentation Foundation)是微软新一代的桌面 UI 框架,
采用 XAML + 数据驱动的设计理念。
WPF 概述
==========
.. list-table::
:header-rows: 1
* - 特性
- WinForms
- WPF
* - 渲染引擎
- GDI+(像素级)
- DirectX(硬件加速)
* - UI 定义
- 代码(设计器生成)
- XAML(声明式)
* - 布局模型
- 绝对定位
- 流式布局(Panel/Grid)
* - 数据绑定
- 手动
- 内置 + 双向绑定
* - 样式
- 逐控件设置
- 样式/模板/触发器
* - 可定制性
- 有限
- 任意控件可完全重模板
* - 学习曲线
- 平缓
- 较陡(MVVM + 模板)
XAML 基础
=============
.. code-block:: xml
:caption: MainWindow.xaml
布局系统
=========
.. code-block:: xml
...
数据绑定
=========
核心概念
----------
.. code-block::
绑定模式:
OneWay :源 → 目标(默认)
TwoWay :源 ↔ 目标
OneTime :初始化时一次
OneWayToSource:目标 → 源
绑定方向:Source (数据源)→ Target (UI 控件)
XAML 绑定语法
---------------
.. code-block:: xml
INotifyPropertyChanged
-----------------------
.. code-block:: csharp
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
protected void SetProperty(ref T field, T value,
[CallerMemberName] string? propertyName = null)
{
if (!EqualityComparer.Default.Equals(field, value))
{
field = value;
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs(propertyName));
}
}
}
public class MainViewModel : ViewModelBase
{
private string _name = "";
public string Name
{
get => _name;
set => SetProperty(ref _name, value);
}
}
命令(ICommand)
==================
.. code-block:: csharp
// RelayCommand 实现
public class RelayCommand : ICommand
{
private readonly Action