如何创建用户控件User Control
一、UserControl 是什么?
UserControl = 你自己封装的可复用 UI 组件
- 本质是一个内容容器控件
- 可以把一堆控件(Button、TextBox、Grid 等)打包成一个整体
- 像 WinForm 的用户控件、网页的组件一样
- 可以在 Window / Page / 其他 UserControl 里反复使用
- 支持自定义属性、自定义事件、数据绑定
与 Window / Page 的区别
表格
| 类型 | 是否可独立显示 | 用途 |
|---|---|---|
| Window | ✅ 可以 | 主窗口、弹窗 |
| Page | ❌ 不可以 | 导航页面 |
| UserControl | ❌ 不可以 | 复用 UI 组件 |
二、创建 UserControl 的步骤(VS 操作)
- 右键项目 → 添加 → 用户控件 (WPF)
- 命名如:
MyUserControl.xaml - 在 XAML 里写界面
- 在后台写逻辑、属性、事件
- 在主窗口或其他地方直接拖放 / 引用使用
三、最简单示例:自定义用户控件
1. 创建用户控件:MyCard.xaml
1 <UserControl x:Class="WpfUserControlDemo.MyCard" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 4 <Grid Background="LightBlue" Margin="10" CornerRadius="8"> 5 <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center"> 6 <TextBlock x:Name="txtTitle" FontSize="20" FontWeight="Bold" Text="标题"/> 7 <TextBlock x:Name="txtContent" Margin="0 10" Text="内容"/> 8 </StackPanel> 9 </Grid> 10 </UserControl>
2. 后台 MyCard.xaml.cs
1 using System.Windows.Controls; 2 3 namespace WpfUserControlDemo 4 { 5 public partial class MyCard : UserControl 6 { 7 public MyCard() 8 { 9 InitializeComponent(); 10 } 11 12 // 普通属性 13 public string Title 14 { 15 get => txtTitle.Text; 16 set => txtTitle.Text = value; 17 } 18 19 public string Content 20 { 21 get => txtContent.Text; 22 set => txtContent.Text = value; 23 } 24 } 25 }
四、在主窗口使用这个用户控件
方法 1:XAML 直接引用
先在 Window 顶部引入命名空间:
1 xmlns:local="clr-namespace:WpfUserControlDemo"
然后使用:
1 <Window x:Class="WpfUserControlDemo.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:local="clr-namespace:WpfUserControlDemo"> 5 6 <Grid> 7 <StackPanel> 8 <!-- 直接使用 --> 9 <local:MyCard Title="卡片1" Content="这是第一个用户控件"/> 10 <local:MyCard Title="卡片2" Content="这是第二个用户控件"/> 11 </StackPanel> 12 </Grid> 13 </Window>
方法 2:后台代码创建
1 var card = new MyCard(); 2 card.Title = "代码创建的卡片"; 3 card.Content = "动态添加"; 4 stackPanel.Children.Add(card);
五、进阶:自定义依赖属性(支持绑定)
普通属性不支持 MVVM 绑定,必须用 依赖属性(DependencyProperty)。
示例:给 MyCard 添加可绑定标题
1 public static readonly DependencyProperty TitleProperty = 2 DependencyProperty.Register( 3 nameof(Title), 4 typeof(string), 5 typeof(MyCard), 6 new PropertyMetadata("默认标题")); 7 8 public string Title 9 { 10 get => (string)GetValue(TitleProperty); 11 set => SetValue(TitleProperty, value); 12 }
然后 XAML 绑定:
1 <local:MyCard Title="{Binding MyTitle}"/>
六、进阶:自定义事件(向外通知)
用户控件内部按钮点击,要通知父窗口。
1. 定义事件
1 public event RoutedEventHandler OnCardClick; 2 3 private void Button_Click(object sender, RoutedEventArgs e) 4 { 5 OnCardClick?.Invoke(this, e); 6 }
2. 外部使用
1 <local:MyCard OnCardClick="MyCard_OnCardClick"/>
七、UserControl 最常用的场景
- 表单条目(用户名输入框、手机号输入)
- 列表项模板(商品卡片、消息卡片)
- 功能模块(搜索栏、顶部导航、底部状态栏)
- 弹窗内部内容
- 复杂 UI 拆分,降低单个窗口代码复杂度
八、核心特点总结
- UserControl 是组合控件,不是窗口,不能独立运行
- 封装后可任意地方复用
- 支持:
- 普通属性
- 依赖属性(绑定必备)
- 自定义事件
- 命令
- MVVM
- 结构:一个 XAML + 一个后台类
- 使用方式:直接拖放或用命名空间引用
浙公网安备 33010602011771号