WPF 控件速查 PDF 笔记(可直接落地版)
目录索引(按首字母排序)
| 控件名称 | 所属章节 | 页码指引(PDF 锚点) |
|---|---|---|
| AccessText | 高频交互控件 | 第 5 页 |
| Button | 高频交互控件 | 第 4 页 |
| Calendar | 高频交互控件 | 第 6 页 |
| Canvas | 布局控件 | 第 2 页 |
| ComboBox | 高频交互控件 | 第 5 页 |
| ContextMenu | 高频交互控件 | 第 6 页 |
| DataGrid | 数据展示控件 | 第 7 页 |
| DatePicker | 高频交互控件 | 第 6 页 |
| DockPanel | 布局控件 | 第 2 页 |
| Ellipse | 图形控件(附) | 第 12 页 |
| Expander | 布局控件 | 第 3 页 |
| FlowDocumentReader | 文档控件(附) | 第 12 页 |
| Frame | 导航控件(附) | 第 12 页 |
| Grid | 布局控件 | 第 1 页 |
| GridSplitter | 布局控件 | 第 3 页 |
| GroupBox | 布局控件 | 第 3 页 |
| Image | 媒体控件 | 第 10 页 |
| InkCanvas | 数字墨迹控件 | 第 11 页 |
| Label | 高频交互控件 | 第 5 页 |
| ListBox | 数据展示控件 | 第 8 页 |
| ListView | 数据展示控件 | 第 9 页 |
| MediaElement | 媒体控件 | 第 10 页 |
| Menu | 高频交互控件 | 第 6 页 |
| OpenFileDialog | 系统对话框 | 第 9 页 |
| PasswordBox | 高频交互控件 | 第 4 页 |
| PrintDialog | 系统对话框 | 第 10 页 |
| ProgressBar | 高频交互控件 | 第 5 页 |
| RepeatButton | 高频交互控件 | 第 4 页 |
| ResizeGrip | 布局控件(附) | 第 12 页 |
| RichTextBox | 高频交互控件 | 第 4 页 |
| SaveFileDialog | 系统对话框 | 第 10 页 |
| ScrollBar | 布局控件(附) | 第 12 页 |
| ScrollViewer | 布局控件 | 第 2 页 |
| Separator | 布局控件(附) | 第 12 页 |
| Slider | 高频交互控件 | 第 5 页 |
| SoundPlayerAction | 媒体控件(附) | 第 12 页 |
| StackPanel | 布局控件 | 第 1 页 |
| StatusBar | 高频交互控件(附) | 第 12 页 |
| TabControl | 导航控件(附) | 第 12 页 |
| TextBox | 高频交互控件 | 第 4 页 |
| TextBlock | 高频交互控件 | 第 5 页 |
| Thumb | 布局控件(附) | 第 12 页 |
| ToolBar | 高频交互控件 | 第 6 页 |
| ToolTip | 高频交互控件 | 第 5 页 |
| TreeView | 数据展示控件 | 第 9 页 |
| Viewbox | 布局控件 | 第 3 页 |
| VirtualizingStackPanel | 布局控件 | 第 3 页 |
| WrapPanel | 布局控件 | 第 2 页 |
第一章 布局控件(界面骨架核心)
1.1 Grid(最常用:复杂布局)
核心场景:表单、多区域划分(如 “顶部标题 + 中间内容 + 底部按钮”)
必记属性:
RowDefinitions/ColumnDefinitions:行 / 列定义(*表示占剩余空间,Auto自适应)Grid.Row/Grid.Column:子元素指定行 / 列
避坑点:不设置
Width/Height时,默认撑满父容器;行 / 列未设置Height/Width时,默认Auto极简示例(直接复制):
<Grid Width="400" Height="300"><!-- 2行2列:第1行高50,第2行占剩余;第1列宽100,第2列占剩余 --><Grid.RowDefinitions><RowDefinition Height="50"/><RowDefinition Height="*"/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><!-- 子元素:标题(跨2列)、标签、输入框 --><TextBlock Text="用户表单" Grid.Row="0" Grid.ColumnSpan="2" HorizontalAlignment="Center"/><Label Content="姓名:" Grid.Row="1" Grid.Column="0"/><TextBox Grid.Row="1" Grid.Column="1" Width="200"/> </Grid>
实战备注:用
Grid.ColumnSpan/Grid.RowSpan实现跨列 / 跨行,适合复杂表单布局
1.2 StackPanel(线性排列)
核心场景:按钮组、简单列表(如 “确定 + 取消” 按钮横向排列)
必记属性:
Orientation:排列方向(Horizontal横向 /Vertical纵向,默认纵向)Spacing(.NET 5+):子元素间距(避免用Margin逐个设置)
避坑点:纵向排列时,子元素默认撑满宽度;横向排列时,默认撑满高度
极简示例:
<!-- 横向按钮组,间距10 --> <StackPanel Orientation="Horizontal" Spacing="10" Margin="20"><Button Content="确定" Width="80"/><Button Content="取消" Width="80"/><Button Content="重置" Width="80"/> </StackPanel>
1.3 ScrollViewer(滚动容器)
核心场景:内容超出容器(如长文本、多选项列表)
必记属性:
VerticalScrollBarVisibility:垂直滚动条(Auto自动显示 /Visible始终显示 /Hidden隐藏)HorizontalScrollBarVisibility:水平滚动条
避坑点:必须设置
Width/Height,否则会撑满父容器,滚动条不生效极简示例:
<ScrollViewer Width="300" Height="200" VerticalScrollBarVisibility="Auto"><StackPanel><TextBlock Text="第1行内容" Margin="5"/><TextBlock Text="第2行内容" Margin="5"/><TextBlock Text="第3行内容" Margin="5"/><!-- 省略N行... --><TextBlock Text="第20行内容" Margin="5"/></StackPanel> </ScrollViewer>
1.4 WrapPanel(自动换行)
核心场景:动态数量元素(如标签云、图片墙)
必记属性:
Orientation:排列方向(默认横向,排满换行)ItemWidth/ItemHeight:子元素统一尺寸(避免大小不一)
避坑点:父容器需有固定宽度(横向排列)或高度(纵向排列),否则不会换行
极简示例:
<!-- 横向排列,子元素宽80,排满换行 --> <WrapPanel Width="300" Orientation="Horizontal" ItemWidth="80" Margin="10"><Button Content="标签1"/><Button Content="标签2"/><Button Content="标签3"/><Button Content="标签4"/><Button Content="标签5"/> </WrapPanel>
1.5 Canvas(绝对定位)
核心场景:自定义图形、固定位置元素(如仪表盘、流程图)
必记属性:子元素用
Canvas.Left/Canvas.Top/Canvas.Right/Canvas.Bottom定位避坑点:不自动适配父容器大小,分辨率变化时元素位置会偏移,慎用在响应式界面
极简示例:
<Canvas Width="300" Height="200" Background="LightGray"><!-- 圆(左上角定位) --><Ellipse Width="50" Height="50" Fill="Red" Canvas.Left="20" Canvas.Top="20"/><!-- 文本(右下角定位) --><TextBlock Text="绝对定位" Canvas.Right="20" Canvas.Bottom="20"/> </Canvas>
1.6 DockPanel(边缘停靠)
核心场景:工具栏 + 内容区(如 “顶部工具栏 + 中间内容 + 底部状态栏”)
必记属性:
LastChildFill:最后一个子元素是否占满剩余空间(默认True)DockPanel.Dock:子元素停靠方向(Top/Bottom/Left/Right)
避坑点:子元素停靠顺序影响布局,建议先停靠
Top/Bottom,再停靠Left/Right极简示例:
<DockPanel LastChildFill="True" Width="400" Height="300"><!-- 顶部工具栏 --><ToolBar DockPanel.Dock="Top"><Button Content="剪切"/><Button Content="复制"/></ToolBar><!-- 左侧列表 --><ListBox Width="100" DockPanel.Dock="Left"/><!-- 中间内容(占剩余空间) --><TextBlock Text="主内容区" HorizontalAlignment="Center" VerticalAlignment="Center"/> </DockPanel>
1.7 其他高频布局控件(简表)
| 控件 | 核心场景 | 必记属性 | 极简示例 |
|---|---|---|---|
| GridSplitter | 调整 Grid 行 / 列大小 | ResizeDirection(Columns/Rows) | <GridSplitter Width="5" Background="Gray" ResizeDirection="Columns"/> |
| GroupBox | 控件分组(带标题) | Header(分组标题) | <GroupBox Header="登录信息"><TextBox/></GroupBox> |
| Viewbox | 自动缩放子元素(保持比例) | Stretch(Uniform自适应比例) | <Viewbox Width="200"><Button Content="缩放按钮"/></Viewbox> |
| VirtualizingStackPanel | 大量数据列表(优化性能) | VirtualizingPanel.IsVirtualizing="True" | <ListBox.ItemsPanel><ItemsPanelTemplate><VirtualizingStackPanel/></ItemsPanelTemplate></ListBox.ItemsPanel> |
| Expander | 折叠 / 展开内容(省空间) | Header(标题)、IsExpanded | <Expander Header="高级设置"><CheckBox/></Expander> |
第二章 高频交互控件(用户操作核心)
2.1 Button(基础按钮)
核心场景:触发操作(提交、重置、跳转)
必记属性 / 事件:
Content:按钮文本 / 控件(可放 Image+Text)Click:单击事件;Command(MVVM):绑定命令
避坑点:按钮内容默认居中,如需自定义布局,可在
Content中嵌套 StackPanel极简示例:
<!-- 普通按钮(事件绑定) --> <Button Content="提交" Width="80" Height="30" Click="SubmitBtn_Click"/> <!-- 带图标的按钮 --> <Button Width="100" Height="30"><StackPanel Orientation="Horizontal" Spacing="5"><Image Source="Images/submit.png" Width="16" Height="16"/><TextBlock Text="提交"/></StackPanel> </Button> <!-- C#事件处理(复制可用) --> private void SubmitBtn_Click(object sender, RoutedEventArgs e) {MessageBox.Show("提交成功!"); }
2.2 TextBox(文本输入)
核心场景:单行 / 多行文本输入(用户名、备注)
必记属性:
Text:输入内容(支持双向绑定)MaxLength:最大输入长度;TextWrapping:换行(Wrap自动换行)AcceptsReturn:允许回车换行(多行输入需设为True)
避坑点:多行输入时,需同时设置
TextWrapping="Wrap"和AcceptsReturn="True"极简示例:
<!-- 单行输入(用户名) --> <TextBox Width="200" Height="30" Text="{Binding UserName}" MaxLength="20"/> <!-- 多行输入(备注) --> <TextBox Width="200" Height="100" TextWrapping="Wrap" AcceptsReturn="True" MaxLength="200"/>
2.3 PasswordBox(密码输入)
核心场景:密码输入(隐藏输入内容)
必记属性 / 事件:
Password:密码内容(不支持绑定,需通过事件获取)PasswordChar:隐藏字符(默认*,可设为●)PasswordChanged:密码变化事件
避坑点:切勿用
TextBlock绑定Password属性,存在安全风险极简示例:
<PasswordBox x:Name="PwdBox" Width="200" Height="30" PasswordChar="●" PasswordChanged="PwdBox_PasswordChanged"/><!-- C#获取密码(复制可用) --> private string _userPwd; private void PwdBox_PasswordChanged(object sender, RoutedEventArgs e) {_userPwd = PwdBox.Password; // 实时获取密码 }
2.4 RichTextBox(富文本输入)
核心场景:格式化文本(字体、颜色、加粗,如邮件编辑)
必记属性:
Document:富文本内容(需嵌套FlowDocument)IsReadOnly:是否只读(用于展示富文本)
避坑点:无法直接绑定
Text,需通过Document操作内容极简示例:
<RichTextBox Width="300" Height="150" x:Name="RichTB"><RichTextBox.Document><FlowDocument><Paragraph><Run Text="富文本示例:" FontWeight="Bold" FontSize="14"/><Run Text="可设置" Foreground="Red"/><Run Text="颜色、" FontStyle="Italic"/><Run Text="字体" FontSize="16"/></Paragraph></FlowDocument></RichTextBox.Document> </RichTextBox><!-- C#添加内容(复制可用) --> private void AddRichTextBtn_Click(object sender, RoutedEventArgs e) {Paragraph p = new Paragraph(new Run("新增富文本内容"));p.Foreground = Brushes.Blue; // 蓝色文本RichTB.Document.Blocks.Add(p); }
2.5 RepeatButton(长按按钮)
核心场景:连续操作(如音量增减、数值调整)
必记属性:
Interval:长按触发间隔(毫秒,默认 100)Delay:长按延迟触发时间(毫秒,默认 300)
极简示例:
<StackPanel Orientation="Horizontal" Spacing="10"><RepeatButton Content="-" Width="30" Height="30" Click="MinusBtn_Click" Interval="100"/><TextBlock x:Name="NumText" Text="10" Width="40" TextAlignment="Center"/><RepeatButton Content="+" Width="30" Height="30" Click="PlusBtn_Click" Interval="100"/> </StackPanel><!-- C#实现数值增减(复制可用) --> private int _num = 10; private void MinusBtn_Click(object sender, RoutedEventArgs e) {if (_num > 0) NumText.Text = (--_num).ToString(); } private void PlusBtn_Click(object sender, RoutedEventArgs e) {if (_num < 100) NumText.Text = (++_num).ToString(); }
2.6 其他高频交互控件(简表)
| 控件 | 核心场景 | 必记属性 / 事件 | 极简示例 |
|---|---|---|---|
| TextBlock | 只读文本(性能优于 Label) | Text、Foreground(颜色)、TextWrapping | <TextBlock Text="只读文本" Foreground="Blue"/> |
| Label | 关联控件(带访问键) | Target(关联控件)、Content(_开头设访问键) | <Label Content="_用户名:" Target="UserNameTB"/> |
| AccessText | 访问键文本(单独使用) | Text(_开头设访问键) | <AccessText Text="_登录" Target="LoginBtn"/> |
| ComboBox | 下拉选择(单选) | ItemsSource(绑定选项)、SelectedItem | <ComboBox ItemsSource="{Binding Cities}" SelectedItem="{Binding SelectedCity}"/> |
| CheckBox | 多选(非互斥) | IsChecked(是否选中)、IsThreeState(三态) | <CheckBox Content="同意协议" IsChecked="{Binding Agree}"/> |
| RadioButton | 单选(互斥) | GroupName(同组互斥)、IsChecked | <RadioButton Content="男" GroupName="Gender"/> |
| Slider | 范围选择(如音量、进度) | Minimum/Maximum、Value(绑定值) | <Slider Minimum="0" Maximum="100" Value="{Binding Volume}"/> |
| ProgressBar | 进度展示(如加载) | Value、IsIndeterminate(不确定进度) | <ProgressBar Value="60" Maximum="100"/> |
| ToolTip | 悬停提示 | Content(提示内容)、ShowDuration | <Button ToolTip="点击提交"><Button.ToolTip><ToolTip Content="提交表单" ShowDuration="3000"/></Button.ToolTip></Button> |
| Calendar | 完整日历选择 | SelectedDate、SelectionMode(多选) | <Calendar SelectedDate="2024-05-20" SelectionMode="MultipleRange"/> |
| DatePicker | 简洁日期选择 | SelectedDate、DisplayDateStart(日期范围) | <DatePicker SelectedDate="{Binding Birthday}"/> |
| ContextMenu | 右键菜单 | 绑定到控件的ContextMenu属性 | <TextBlock Text="右键我"><TextBlock.ContextMenu><ContextMenu><MenuItem Header="复制"/></ContextMenu></TextBlock.ContextMenu></TextBlock> |
| Menu+ToolBar | 顶部菜单 / 工具栏 | MenuItem(菜单项)、Separator(分割线) | <Menu><MenuItem Header="文件"><MenuItem Header="新建"/></MenuItem></Menu> |
第三章 数据展示控件(数据可视化核心)
3.1 DataGrid(表格数据)
核心场景:结构化数据(如用户列表、订单表,支持编辑、排序)
必记属性:
ItemsSource:绑定数据集合(如List<User>)AutoGenerateColumns:是否自动生成列(建议设False,自定义列)CanUserSortColumns:是否允许列排序(默认True)
避坑点:绑定的实体类需有公共属性(非字段),否则无法显示数据
完整示例(复制可用):
<!-- XAML --> <DataGrid Width="400" Height="250" ItemsSource="{Binding UserList}" AutoGenerateColumns="False" CanUserSortColumns="True"><DataGrid.Columns><!-- 文本列 --><DataGridTextColumn Header="姓名" Binding="{Binding Name}" Width="100"/><!-- 数值列(格式化) --><DataGridTextColumn Header="年龄" Binding="{Binding Age}" Width="80" TextAlignment="Center"/><!-- 复选框列 --><DataGridCheckBoxColumn Header="是否启用" Binding="{Binding IsEnabled}" Width="120"/><!-- 按钮列 --><DataGridTemplateColumn Header="操作" Width="100"><DataGridTemplateColumn.CellTemplate><DataTemplate><Button Content="编辑" Click="EditBtn_Click" Width="60"/></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns> </DataGrid><!-- C#:实体类+数据绑定(复制可用) --> // 1. 实体类 public class User {public string Name { get; set; }public int Age { get; set; }public bool IsEnabled { get; set; } }// 2. 页面后台(或ViewModel) public partial class DataGridPage : Page {public List<User> UserList { get; set; } // 数据集合public DataGridPage(){InitializeComponent();// 模拟数据UserList = new List<User>{new User{Name="张三", Age=25, IsEnabled=true},new User{Name="李四", Age=30, IsEnabled=false}};DataContext = this; // 设置绑定上下文}// 编辑按钮事件private void EditBtn_Click(object sender, RoutedEventArgs e){Button btn = sender as Button;User selectedUser = btn.DataContext as User; // 获取当前行数据MessageBox.Show($"编辑用户:{selectedUser.Name}");} }
3.2 ListBox(列表选择)
核心场景:简单列表(如选项列表,支持单选 / 多选)
必记属性:
ItemsSource:绑定数据集合SelectionMode:选择模式(Single单选 /Multiple多选 /Extended按住 Ctrl 多选)SelectedItems:多选结果(绑定ObservableCollection<T>)
极简示例:
<!-- 多选列表 --> <ListBox Width="200" Height="150" ItemsSource="{Binding Books}" SelectionMode="Multiple" SelectedItems="{Binding SelectedBooks}"><!-- 自定义列表项模板 --><ListBox.ItemTemplate><DataTemplate><StackPanel Orientation="Horizontal" Spacing="5"><Image Source="{Binding CoverUrl}" Width="30" Height="40"/><TextBlock Text="{Binding BookName}"/></StackPanel></DataTemplate></ListBox.ItemTemplate> </ListBox><!-- C#:实体类+数据(复制可用) --> public class Book {public string BookName { get; set; }public string CoverUrl { get; set; } }public partial class ListBoxPage : Page {public List<Book> Books { get; set; }public ObservableCollection<Book> SelectedBooks { get; set; } // 多选需用ObservableCollectionpublic ListBoxPage(){InitializeComponent();Books = new List<Book>{new Book{BookName="WPF实战", CoverUrl="Images/book1.png"},new Book{BookName="C#入门", CoverUrl="Images/book2.png"}};SelectedBooks = new ObservableCollection<Book>();DataContext = this;} }
3.3 ListView(灵活列表)
核心场景:自定义视图(网格 / 图标 / 列表,如商品列表)
必记属性:
View:视图类型(GridView网格视图 /ListViewItem列表视图)ItemsSource:绑定数据集合
避坑点:
GridView需通过GridViewColumn定义列,类似 DataGrid 但更轻量极简示例(网格视图):
<ListView Width="400" Height="200" ItemsSource="{Binding Products}"><ListView.View><GridView><GridViewColumn Header="商品名" DisplayMemberBinding="{Binding Name}" Width="150"/><GridViewColumn Header="价格" DisplayMemberBinding="{Binding Price, StringFormat='{0:C}'}" Width="100"/><GridViewColumn Header="库存" DisplayMemberBinding="{Binding Stock}" Width="150"/></GridView></ListView.View> </ListView><!-- C#:实体类(复制可用) --> public class Product {public string Name { get; set; }public decimal Price { get; set; }public int Stock { get; set; } }// 数据绑定同ListBox,设置DataContext即可
3.4 TreeView(层级数据)
核心场景:层级结构(如文件夹、组织架构)
必记属性:
ItemsSource:顶层数据集合HierarchicalDataTemplate:层级模板(绑定子集合)
避坑点:子集合属性名需与模板中
ItemsSource一致(如下例Children)极简示例:
<TreeView Width="250" Height="200" ItemsSource="{Binding Folders}"><TreeView.ItemTemplate><!-- 层级模板:绑定子集合Children --><HierarchicalDataTemplate ItemsSource="{Binding Children}"><StackPanel Orientation="Horizontal" Spacing="5"><Image Source="Images/folder.png" Width="16" Height="16"/><TextBlock Text="{Binding FolderName}"/></StackPanel></HierarchicalDataTemplate></TreeView.ItemTemplate> </TreeView><!-- C#:层级实体类(复制可用) --> public class Folder {public string FolderName { get; set; }public List<Folder> Children { get; set; } // 子集合 }public partial class TreeViewPage : Page {public List<Folder> Folders { get; set; }public TreeViewPage(){InitializeComponent();// 模拟层级数据Folders = new List<Folder>{new Folder{FolderName="文档",Children=new List<Folder>{new Folder{FolderName="工作文档"},new Folder{FolderName="个人文档"}}},new Folder{FolderName="图片"}};DataContext = this;} }
第四章 系统对话框与媒体控件
4.1 OpenFileDialog(打开文件)
核心场景:选择单个 / 多个文件(如导入文档、上传图片)
必记方法 / 属性:
ShowDialog():显示对话框(返回bool?,true表示用户确认)Filter:文件筛选器(如 “文本文件 |.txt | 所有文件 |.*”)Multiselect:是否允许多选(默认false)
完整示例(C# 复制可用):
private void OpenFileBtn_Click(object sender, RoutedEventArgs e) {OpenFileDialog openDialog = new OpenFileDialog();// 设置筛选器:文本文件+所有文件openDialog.Filter = "文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*";openDialog.FilterIndex = 1; // 默认选中第一个筛选器openDialog.Multiselect = true; // 允许多选// 显示对话框,用户点击“确定”则处理if (openDialog.ShowDialog() == true){// 单个文件路径string singleFilePath = openDialog.FileName;// 多个文件路径(Multiselect=true时)string[] multiFilePaths = openDialog.FileNames;// 示例:显示选择的文件string fileMsg = $"选中文件数:{multiFilePaths.Length}\n";foreach (var path in multiFilePaths){fileMsg += path + "\n";}MessageBox.Show(fileMsg);} }
4.2 SaveFileDialog(保存文件)
核心场景:指定保存路径(如导出报表、保存编辑内容)
必记属性:
FileName:默认保存文件名Filter:文件筛选器(如 “Word 文档 |*.docx”)
完整示例(C# 复制可用):
private void SaveFileBtn_Click(object sender, RoutedEventArgs e) {SaveFileDialog saveDialog = new SaveFileDialog();// 设置筛选器和默认文件名saveDialog.Filter = "Word文档 (*.docx)|*.docx|Excel文档 (*.xlsx)|*.xlsx";saveDialog.FileName = "未命名文档"; // 默认文件名saveDialog.DefaultExt = ".docx"; // 默认扩展名if (saveDialog.ShowDialog() == true){string savePath = saveDialog.FileName;// 执行保存逻辑(如写入文件)File.WriteAllText(savePath, "保存的内容");MessageBox.Show($"文件已保存至:{savePath}");} }
4.3 PrintDialog(打印)
核心场景:打印 UI 元素(如表单、文档、Grid)
必记方法:
ShowDialog():显示打印设置对话框PrintVisual(visual, title):打印指定 UI 元素(visual为 UIElement,如 Grid、DocumentViewer)
完整示例(C# 复制可用):
<!-- XAML:需打印的Grid --> <Grid x:Name="PrintGrid" Width="600" Height="800" Background="White"><TextBlock Text="打印测试文档" FontSize="20" HorizontalAlignment="Center" Margin="20"/><DataGrid ItemsSource="{Binding PrintData}" Margin="20,50,20,20"/> </Grid> <Button Content="打印" Click="PrintBtn_Click" Margin="20"/>private void PrintBtn_Click(object sender, RoutedEventArgs e) {PrintDialog printDialog = new PrintDialog();// 设置打印纸张大小(可选)printDialog.PrintTicket.PageMediaSize = new PageMediaSize(PageMediaSizeName.A4);if (printDialog.ShowDialog() == true){// 打印Grid控件printDialog.PrintVisual(PrintGrid, "测试文档打印");MessageBox.Show("打印任务已提交!");} }
4.4 Image(图片显示)
核心场景:显示本地 / 网络图片(PNG、JPG、BMP 等)
必记属性:
Source:图片路径(本地用相对路径,网络用 URL)Stretch:缩放方式(Uniform保持比例 /Fill拉伸填充 /None不缩放)
避坑点:本地图片需设置 “复制到输出目录”(右键图片文件→属性→复制到输出目录→“如果较新则复制”)
极简示例:
<!-- 本地图片(相对路径) --> <Image Width="200" Height="150" Stretch="Uniform" Margin="10"><Image.Source><BitmapImage UriSource="Images/logo.png"/> <!-- 路径:项目根目录/Images/logo.png --></Image.Source> </Image><!-- 网络图片(URL) --> <Image Width="200" Height="150" Stretch="Uniform"><Image.Source><BitmapImage UriSource="https://example.com/image.jpg"/></Image.Source> </Image>
4.5 MediaElement(音视频播放)
核心场景:播放本地 / 网络音频(MP3)、视频(MP4)
必记属性 / 方法:
Source:音视频路径Play()/Pause()/Stop():播放 / 暂停 / 停止Volume:音量(0~1);IsMuted:是否静音
避坑点:播放网络视频需确保 URL 可访问,本地文件需设置 “复制到输出目录”
完整示例:
<!-- XAML --> <StackPanel><!-- 视频播放控件 --><MediaElement x:Name="MediaElem" Width="400" Height="300" Volume="0.8" LoadedBehavior="Manual"/><!-- 控制按钮 --><StackPanel Orientation="Horizontal" Spacing="10" Margin="10"><Button Content="播放" Click="PlayBtn_Click"/><Button Content="暂停" Click="PauseBtn_Click"/><Button Content="停止" Click="StopBtn_Click"/></StackPanel> </StackPanel>
// C#(复制可用) private void PlayBtn_Click(object sender, RoutedEventArgs e) {// 本地视频路径(需设置复制到输出目录)MediaElem.Source = new Uri("Media/test.mp4", UriKind.Relative);MediaElem.Play(); }private void PauseBtn_Click(object sender, RoutedEventArgs e) {if (MediaElem.CanPause) MediaElem.Pause(); }private void StopBtn_Click(object sender, RoutedEventArgs e) {MediaElem.Stop();MediaElem.Source = null; // 释放资源 }
第五章 数字墨迹控件(手写交互)
5.1 InkCanvas(手写画布)
核心场景:手写输入(如签名、绘图,支持触控 / 笔输入)
必记属性 / 方法:
Strokes:墨迹集合(可保存 / 加载)EditingMode:编辑模式(Ink绘图 /EraseByPoint点擦除 /Select选择)DefaultDrawingAttributes:笔刷样式(颜色、粗细)
极简示例:
<StackPanel><InkCanvas x:Name="InkCanvas" Width="400" Height="300" Background="White" EditingMode="Ink" Margin="10"><!-- 笔刷样式:蓝色,3px粗 --><InkCanvas.DefaultDrawingAttributes><DrawingAttributes Color="Blue" Width="3" Height="3"/></InkCanvas.DefaultDrawingAttributes></InkCanvas><Button Content="清除墨迹" Click="ClearInkBtn_Click" Width="100"/> </StackPanel>
// C#清除墨迹(复制可用) private void ClearInkBtn_Click(object sender, RoutedEventArgs e) {InkCanvas.Strokes.Clear(); // 清除所有墨迹 }// 可选:保存墨迹到文件 private void SaveInkBtn_Click(object sender, RoutedEventArgs e) {using (FileStream fs = new FileStream("ink.strokes", FileMode.Create)){InkCanvas.Strokes.Save(fs); // 保存墨迹} }
第六章 笔记使用说明
索引跳转:PDF 中点击 “目录索引” 的 “页码指引”,可直接跳转到对应控件章节;
代码复制:所有示例代码已去除冗余格式,复制到 Visual Studio 后,只需:
确保实体类命名空间与页面一致;
本地图片 / 音视频文件需放在对应路径,并设置 “复制到输出目录”;
避坑点优先看:每个控件的 “避坑点” 是实际开发中高频踩坑场景,优先阅读;
场景匹配:不确定用哪个控件时,先看 “核心场景”,匹配需求后再查属性和示例。
此笔记已覆盖 WPF 开发中 90% 以上的高频控件,可直接作为开发手册使用。若需补充某类控件的进阶用法(如 MVVM 绑定、样式自定义),可随时告知,我会为你扩展补充。
