文档
WPF 毕设入门教程——Windows 桌面开发
前言
WPF 是 Windows 桌面开发的高配选择,适合毕设中需要复杂界面的项目:教务管理系统、销售管理、数据看板等。
第一章:MVVM 模式理解
MVVM = Model - View - ViewModel,是 WPF 的灵魂模式。
View (XAML) ←→ ViewModel (C#) ←→ Model (数据类)
绑定 属性/命令 数据
为什么 MVVM?
- View 零代码:XAML 只写界面,不写逻辑
- 可测试:ViewModel 不依赖 UI,可单元测试
- 解耦:设计师改界面不影响逻辑
第二章:数据绑定速成
基础绑定
<TextBlock Text="{Binding StudentName}" />
双向绑定(输入框)
<TextBox Text="{Binding StudentName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
集合绑定
<ListBox ItemsSource="{Binding Students}"
DisplayMemberPath="Name" />
数据上下文
// Code-Behind 或 XAML
this.DataContext = new MainViewModel();
第三章:毕设实战——图书管理系统界面
主界面布局(XAML 骨架)
<Window ...>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/> <!-- 侧边栏 -->
<ColumnDefinition Width="*"/> <!-- 主内容 -->
</Grid.ColumnDefinitions>
<!-- 导航菜单 -->
<ListBox Grid.Column="0" ItemsSource="{Binding MenuItems}" />
<!-- 内容区:根据选择切换 -->
<ContentControl Grid.Column="1"
Content="{Binding SelectedViewModel}" />
</Grid>
</Window>
ViewModel 核心代码
public class MainViewModel : INotifyPropertyChanged
{
public ObservableCollection<Book> Books { get; } = new();
private Book? _selectedBook;
public Book? SelectedBook
{
get => _selectedBook;
set { _selectedBook = value; OnPropertyChanged(); }
}
// 搜索命令
public ICommand SearchCommand { get; }
public MainViewModel()
{
SearchCommand = new RelayCommand(async () =>
{
var results = await _bookService.SearchAsync(Keyword);
Books.Clear();
foreach (var b in results) Books.Add(b);
});
}
}
第四章:样式与美化
Material Design 集成(毕设颜值加分)
dotnet add package MaterialDesignThemes
<Window xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes"
Background="{DynamicResource MaterialDesignPaper}">
<Button Style="{StaticResource MaterialDesignRaisedButton}"
Content="搜索" />
</Window>
第五章:毕设常见问题
| 问题 | 解决 |
|---|---|
| 数据不更新 | 检查是否实现了 INotifyPropertyChanged |
| DataGrid 列不显示 | 设置 AutoGenerateColumns="False" 并手动定义列 |
| 窗口打开慢 | 考虑使用异步初始化,或启动画面(Splash Screen) |
| 发布后缺 DLL | 发布模式选「独立」,包含 .NET 运行时 |
思考题
- MVVM 中的
ICommand和传统Click事件有什么本质区别? - 如何实现 WPF 中的页面导航(类似浏览器前进/后退)?
DependencyProperty和普通 CLR 属性有什么区别?何时使用?