第一部分:WPF基础入门
1. WPF概述与核心概念
Windows Presentation Foundation(WPF)是微软推出的用于构建Windows桌面应用程序的UI框架,作为.NET Framework的一部分首次发布于2006年。与Windows Forms相比,WPF引入了多项革命性改进:
- XAML标记语言:实现界面与逻辑的分离
- 矢量图形系统:支持分辨率无关的界面渲染
- 数据驱动UI:强大的数据绑定能力
- 样式与模板:高度可定制的视觉呈现
- 硬件加速:利用DirectX实现高性能渲染
2. 开发环境配置
推荐开发环境:
- Visual Studio 2022(社区版即可)
- .NET 6/7/8(WPF已跨平台支持)
创建第一个WPF项目:
- 打开Visual Studio
- 选择”创建新项目”
- 搜索”WPF应用程序”
- 设置项目名称和位置
- 选择目标框架(推荐.NET 6+)
- 点击”创建”
3. XAML基础语法
XAML(eXtensible Application Markup Language)是WPF的核心标记语言,用于定义用户界面:
<Window x:Class="WpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Button Content="点击我" HorizontalAlignment="Center"
VerticalAlignment="Center" Click="Button_Click"/>
</Grid>
</Window>
对应C#代码文件:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("按钮被点击了!");
}
}
第二部分:WPF核心组件
4. 布局系统与面板控件
WPF提供了多种布局容器,每种都有特定的布局行为:
面板类型 | 布局行为 | 适用场景 |
---|---|---|
Grid | 行列表格式布局 | 复杂结构化界面 |
StackPanel | 单行/单列顺序排列 | 简单线性排列的控件 |
DockPanel | 停靠到边缘的布局 | 类似IDE的主界面布局 |
WrapPanel | 自动换行布局 | 流式排列的项目集合 |
Canvas | 绝对定位布局 | 需要精确定位的图形元素 |
UniformGrid | 均匀分布的网格 | 简单网格布局 |
Grid布局示例:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="2*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.ColumnSpan="2" Content="标题" FontSize="16"/>
<TextBox Grid.Row="1" Grid.Column="1" Text="内容区域"/>
<Button Grid.Row="2" Grid.Column="0" Content="确定"/>
<Button Grid.Row="2" Grid.Column="1" Content="取消"/>
</Grid>
5. 常用控件详解
5.1 基础控件
- Button:按钮控件,支持各种点击交互
- TextBox:文本输入框
- Label:静态文本显示
- ComboBox:下拉选择框
- ListBox:列表框
- CheckBox:复选框
- RadioButton:单选按钮
5.2 高级控件
- DataGrid:数据表格,支持复杂数据展示
- TreeView:树形视图
- TabControl:选项卡控件
- ProgressBar:进度条
- Slider:滑块控件
- Calendar/DatePicker:日期选择控件
DataGrid使用示例:
<DataGrid x:Name="dataGrid" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="姓名" Binding="{Binding Name}"/>
<DataGridTextColumn Header="年龄" Binding="{Binding Age}"/>
<DataGridCheckBoxColumn Header="是否在职" Binding="{Binding IsActive}"/>
</DataGrid.Columns>
</DataGrid>
public class Employee
{
public string Name { get; set; }
public int Age { get; set; }
public bool IsActive { get; set; }
}
// 数据绑定
dataGrid.ItemsSource = new List<Employee>
{
new Employee { Name = "张三", Age = 28, IsActive = true },
new Employee { Name = "李四", Age = 35, IsActive = false }
};
第三部分:WPF高级特性
6. 数据绑定深入
WPF的数据绑定系统是其最强大的功能之一,支持多种绑定模式:
<TextBlock Text="{Binding UserName, Mode=OneWay}"/>
<Slider Value="{Binding Volume, Mode=TwoWay}"/>
<Label Content="{Binding Score, StringFormat=分数:{0}}"/>
<Image Source="{Binding Avatar, Converter={StaticResource ImageConverter}}"/>
绑定模式:
- OneTime:一次性绑定
- OneWay:源→目标单向绑定
- TwoWay:双向绑定
- OneWayToSource:目标→源单向绑定
INotifyPropertyChanged实现:
public class User : INotifyPropertyChanged
{
private string _name;
public string Name
{
get => _name;
set
{
_name = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
7. 样式与模板
7.1 样式(Style)
<Window.Resources>
<Style x:Key="HighlightButton" TargetType="Button">
<Setter Property="Background" Value="LightBlue"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}"
CornerRadius="5" Padding="10,5">
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Button Style="{StaticResource HighlightButton}" Content="样式按钮"/>
7.2 控件模板(ControlTemplate)
<ControlTemplate x:Key="RoundButtonTemplate" TargetType="Button">
<Grid>
<Ellipse Fill="{TemplateBinding Background}" Stroke="Black"/>
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
<Button Template="{StaticResource RoundButtonTemplate}"
Content="圆形按钮" Width="100" Height="100"/>
8. 动画与视觉效果
基本动画示例:
<Button Content="动画按钮" Width="100" Height="40">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Width"
To="200" Duration="0:0:0.5"
AutoReverse="True"/>
<ColorAnimation Storyboard.TargetProperty="Background.Color"
To="Red" Duration="0:0:0.5"
AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
3D变换示例:
<Viewport3D>
<Viewport3D.Camera>
<PerspectiveCamera Position="0,0,5" LookDirection="0,0,-1"/>
</Viewport3D.Camera>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="-1,-1,0 1,-1,0 -1,1,0 1,1,0"
TriangleIndices="0 1 2 1 3 2"/>
</GeometryModel3D.Geometry>
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Blue"/>
</GeometryModel3D.Material>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
第四部分:WPF实战与架构
9. MVVM架构模式
MVVM(Model-View-ViewModel)是WPF开发的最佳实践架构:
- Model:数据模型和业务逻辑
- View:用户界面(XAML)
- ViewModel:连接View和Model的桥梁
简单MVVM实现:
// Model
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
}
// ViewModel
public class ProductViewModel : INotifyPropertyChanged
{
private ObservableCollection<Product> _products;
public ObservableCollection<Product> Products
{
get => _products;
set
{
_products = value;
OnPropertyChanged();
}
}
public ICommand AddCommand { get; }
public ProductViewModel()
{
Products = new ObservableCollection<Product>();
AddCommand = new RelayCommand(AddProduct);
}
private void AddProduct(object parameter)
{
Products.Add(new Product { Name = "新产品", Price = 9.99m });
}
// INotifyPropertyChanged实现...
}
// View
<Window.DataContext>
<local:ProductViewModel/>
</Window.DataContext>
<Grid>
<ListView ItemsSource="{Binding Products}">
<ListView.View>
<GridView>
<GridViewColumn Header="名称" DisplayMemberBinding="{Binding Name}"/>
<GridViewColumn Header="价格" DisplayMemberBinding="{Binding Price}"/>
</GridView>
</ListView.View>
</ListView>
<Button Command="{Binding AddCommand}" Content="添加" HorizontalAlignment="Right"/>
</Grid>
10. 依赖注入与现代化WPF开发
现代WPF开发推荐使用依赖注入和模块化架构:
// 使用Microsoft.Extensions.DependencyInjection
var services = new ServiceCollection();
services.AddSingleton<MainWindow>();
services.AddTransient<IProductService, ProductService>();
services.AddTransient<ProductViewModel>();
var provider = services.BuildServiceProvider();
var mainWindow = provider.GetRequiredService<MainWindow>();
mainWindow.Show();
11. 性能优化技巧
- 虚拟化容器:对大量数据使用
VirtualizingStackPanel
<ListBox VirtualizingStackPanel.IsVirtualizing="True"/>
- UI线程优化:耗时操作使用异步/await
private async void LoadData_Click(object sender, RoutedEventArgs e)
{
var data = await Task.Run(() => dataService.GetLargeDataSet());
dataGrid.ItemsSource = data;
}
- 冻结自由对象:对不变的资源使用
Freezable.Freeze()
var brush = new SolidColorBrush(Colors.Blue);
brush.Freeze(); // 使画笔不可变,提高性能
- 减少绑定数量:复杂界面使用
x:Shared="False"
减少资源实例
第五部分:WPF进阶主题
12. 自定义控件开发
创建自定义控件的基本步骤:
- 创建继承自Control的类
- 定义默认样式(在Generic.xaml中)
- 添加依赖属性
- 重写OnRender或使用模板
自定义环形进度条示例:
public class CircularProgressBar : Control
{
static CircularProgressBar()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CircularProgressBar),
new FrameworkPropertyMetadata(typeof(CircularProgressBar)));
}
public static readonly DependencyProperty ProgressProperty =
DependencyProperty.Register("Progress", typeof(double), typeof(CircularProgressBar),
new PropertyMetadata(0.0));
public double Progress
{
get => (double)GetValue(ProgressProperty);
set => SetValue(ProgressProperty, value);
}
}
对应Generic.xaml中的样式:
<Style TargetType="{x:Type local:CircularProgressBar}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CircularProgressBar}">
<Viewbox>
<Grid Width="100" Height="100">
<Ellipse Stroke="{TemplateBinding Foreground}"
StrokeThickness="10" Opacity="0.2"/>
<Path Stroke="{TemplateBinding Foreground}" StrokeThickness="10"
StrokeLineCap="Round">
<Path.Data>
<PathGeometry>
<PathFigure StartPoint="50,0">
<ArcSegment Size="50,50" Point="50,0"
SweepDirection="Clockwise"
IsLargeArc="{Binding Progress, Converter={StaticResource ProgressToLargeArc}}"
RotationAngle="{Binding Progress, Converter={StaticResource ProgressToAngle}}"/>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
<TextBlock Text="{Binding Progress, StringFormat={}{0}%}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</Viewbox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
13. WPF与Windows API集成
WPF可以调用Windows API实现高级功能:
// 使用DllImport调用Win32 API
[DllImport("user32.dll")]
public static extern bool FlashWindow(IntPtr hWnd, bool invert);
// 在WPF中调用
var windowHandle = new WindowInteropHelper(this).Handle;
FlashWindow(windowHandle, true);
14. WPF跨平台方案
虽然WPF原生仅支持Windows,但可以通过以下方式实现跨平台:
- Avalonia:类似WPF的跨平台框架
- UNO Platform:支持WPF代码跨平台运行
- .NET MAUI:微软新一代跨平台UI框架
第六部分:WPF项目实战
15. 企业级应用开发实践
典型WPF企业应用架构:
MyWpfApp/
├── Contracts/ # 接口定义
├── Models/ # 数据模型
├── Services/ # 服务实现
├── ViewModels/ # ViewModel层
├── Views/ # 视图层
├── Converters/ # 值转换器
├── Behaviors/ # 交互行为
├── Resources/ # 静态资源
└── App.xaml # 应用入口
现代化WPF开发技术栈:
- MVVM框架:Prism, MVVMLight, Caliburn.Micro
- DI容器:Microsoft.Extensions.DependencyInjection, Autofac
- 测试框架:xUnit, NUnit + Moq
- CI/CD:Azure DevOps, GitHub Actions
- 打包工具:MSIX, ClickOnce
结语:从入门到精通的学习路径
- 初级阶段(1-2个月)
- 掌握XAML基础语法
- 熟悉常用布局和控件
- 理解基本数据绑定
- 中级阶段(3-6个月)
- 深入MVVM模式
- 掌握样式和模板
- 学习动画和视觉效果
- 高级阶段(6-12个月)
- 自定义控件开发
- 性能优化技巧
- 复杂架构设计
- 专家阶段(1年以上)
- 框架底层原理
- 高级图形渲染
- 跨平台解决方案
WPF作为功能强大的桌面开发框架,在工业控制、金融系统、企业应用等领域仍有广泛需求。通过系统学习和不断实践,开发者可以掌握这一技术,构建出高性能、高交互性的现代化桌面应用程序。