如何创建用户控件User Control

一、UserControl 是什么?

UserControl = 你自己封装的可复用 UI 组件
  • 本质是一个内容容器控件
  • 可以把一堆控件(Button、TextBox、Grid 等)打包成一个整体
  • 像 WinForm 的用户控件、网页的组件一样
  • 可以在 Window / Page / 其他 UserControl 里反复使用
  • 支持自定义属性、自定义事件、数据绑定

与 Window / Page 的区别

表格
 
类型是否可独立显示用途
Window ✅ 可以 主窗口、弹窗
Page ❌ 不可以 导航页面
UserControl ❌ 不可以 复用 UI 组件
 

二、创建 UserControl 的步骤(VS 操作)

  1. 右键项目 → 添加 → 用户控件 (WPF)
  2. 命名如:MyUserControl.xaml
  3. 在 XAML 里写界面
  4. 在后台写逻辑、属性、事件
  5. 在主窗口或其他地方直接拖放 / 引用使用

三、最简单示例:自定义用户控件

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 拆分,降低单个窗口代码复杂度

八、核心特点总结

  1. UserControl 是组合控件,不是窗口,不能独立运行
  2. 封装后可任意地方复用
  3. 支持:
    • 普通属性
    • 依赖属性(绑定必备)
    • 自定义事件
    • 命令
    • MVVM 
  4. 结构:一个 XAML + 一个后台类
  5. 使用方式:直接拖放或用命名空间引用
posted on 2026-03-27 14:37  工业搬砖猿Lee  阅读(14)  评论(0)    收藏  举报