WPF通过反射机制动态加载控件

Activator.CreateInstance 是 .NET 提供的一个静态方法,它属于 System 命名空间。此方法通过反射机制根据提供的类型信息。

写一个小demo演示一下

要求:在用户反馈界面点击建议或者评分按钮 弹出相应界面

编写MainWindow.xmal 主窗体

XML 复制代码
<Window x:Class="WpfXMAL.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:local="clr-namespace:WpfXMAL"
  xmlns:uc="clr-namespace:WpfXMAL.UC"
  xmlns:SubFrm="clr-namespace:WpfXMAL.SubFrm"
  mc:Ignorable="d"
  Title="MainWindow" Height="200" Width="200" WindowStartupLocation="CenterScreen">
  <Grid>
    <StackPanel Background="LightBlue">
      <Label Margin="5"   Content="用户反馈" FontSize="16" HorizontalAlignment="Center" ></Label>
      <TextBlock Margin="5px" Text="谢谢你的支持,你选择下列按钮,给与建议和反馈" 
        Foreground="DarkBlue" TextWrapping="WrapWithOverflow"></TextBlock>
      <uc:TLButtom Margin="5" Content="Suggestion" FontSize="14"
        SubTLWindows="{x:Type TypeName = SubFrm:Suggestion}"></uc:TLButtom>
      <uc:TLButtom Margin="5" Content="Evalution" FontSize="14"
        SubTLWindows="{x:Type TypeName = SubFrm:Evalution}"></uc:TLButtom>
    </StackPanel>
  </Grid>
</Window>

创建自定义控件

Activator.CreateInstance 是 .NET 提供的一个静态方法,它属于 System 命名空间。此方法通过反射机制根据提供的类型信息(在这里是 this.SubTLWindows)创建该类型的实例。

在这个上下文中,SubTLWindows 属性的类型是 System.Type,它代表了 .NET 中的一个类型对象。当我们将 this.SubTLWindows 传递给 Activator.CreateInstance 方法时,我们实际上是将这个 Type 对象传递过去,

cs 复制代码
public class TLButtom : Button
{
    // 定义一个公共属性 SubTLWindows,用于存储关联的窗口类型。
    // 这个属性允许在 XAML 中通过绑定设置为特定的 Window 类型。
    public Type SubTLWindows { get; set; }

    // 重写 OnClick 方法,以便当按钮被点击时执行自定义逻辑。
    protected override void OnClick()
    {
        base.OnClick(); // 调用基类的 OnClick 方法,以确保任何默认行为都被触发。

        // 使用反射创建 SubTLWindows 属性所指定类型的实例。
        // Activator.CreateInstance 是 .NET 提供的一个方法,可以用来根据类型创建对象实例。
        // 如果成功创建了实例,并且该实例是 Window 类型,则调用 Show 方法显示这个窗口。
        var window = Activator.CreateInstance(this.SubTLWindows) as Window;
        window?.Show(); // 使用空合并运算符(?.)来安全地调用 Show 方法,如果 window 为 null 则不会抛出异常。
    }
}

编写子窗体

cs 复制代码
<Window x:Class="WpfXMAL.SubFrm.Evalution"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:hc="https://handyorg.github.io/handycontrol"
        xmlns:local="clr-namespace:WpfXMAL.SubFrm"
        mc:Ignorable="d"
        Title="Suggestion" Height="260" Width="200" WindowStartupLocation="CenterScreen">
    <Grid>
        <StackPanel Background="LightBlue">
            <Label Margin="5" Content="您的评分" HorizontalAlignment="Center" ></Label>
            <TextBlock Margin="5" Text=" 请给我们的服务打个分吧,期待您的评分" TextWrapping="WrapWithOverflow" Foreground="DarkBlue" />
            <StackPanel Orientation="Horizontal">
                <hc:Rate  Margin="5"  Value="4.9" AllowHalf="True" ShowText="True" 
                          Foreground="{DynamicResource DangerBrush}" 
                          Icon="{StaticResource SuccessGeometry}"/>
                <Button Content="submit" Background="Bisque"  Margin="5" Foreground="Brown"></Button>
            </StackPanel>
        </StackPanel>
    </Grid>
</Window>

关键代码和逻辑

通过自定义的TLButtom控件实现了点击MainWindow中的按钮来展示Suggestion窗体的功能。以下是实现过程的详细解释:

  1. 定义自定义控件
    • WpfXMAL.UC命名空间中,定义了一个名为TLButtom的类,它继承自Button
    • TLButtom类添加了一个属性SubTLWindows,其类型是Type。这个属性用来指定当按钮被点击时应该实例化并显示的窗口类型。
  1. 覆写按钮点击事件
    • TLButtom类中,重写了OnClick方法。当按钮被点击时,会调用这个方法。
    • OnClick方法内,使用Activator.CreateInstance方法和SubTLWindows属性值来创建一个新的窗口实例。这里利用了反射机制,根据类型信息动态地创建对象。
    • 创建完窗口实例后,检查是否成功创建(即不为null),然后调用Show方法将新窗口显示给用户。
  1. 在XAML中配置按钮
    • MainWindow.xaml文件中,有两个TLButtom控件,每个控件都设置了Content属性(按钮上显示的文字)和SubTLWindows属性。
    • 对于"Suggestion"按钮,SubTLWindows属性设置为{x:Type TypeName=SubFrm:Suggestion},这告诉TLButtom控件,当这个按钮被点击时,应该创建并显示Suggestion类型的窗口。
  1. 运行逻辑
    • 当用户点击MainWindow中的"Suggestion"按钮时,触发了TLButtomOnClick事件处理程序。
    • 该事件处理程序依据SubTLWindows属性的值(这里是Suggestion窗口的类型),创建了一个新的Suggestion窗口实例,并将其显示出来。
相关推荐
军训猫猫头2 小时前
插曲.带“?“的类型
c#
If I could Tell Yang3 小时前
WPF 扩展 TabControl 可保存显示的标签页
wpf
weixin_464078075 小时前
开源Material Design WPF UI 控件库简单上手
ui·wpf
格林威5 小时前
Baumer工业相机堡盟LXT工业相机如何升级固件使得相机具有RDMA功能
人工智能·数码相机·算法·计算机视觉·c#
军训猫猫头6 小时前
34.键盘1 C#例子 WPF例子
开发语言·c#·wpf
sukalot8 小时前
windows C#-事件
开发语言·c#
yutian06068 小时前
C# 去除字符串中首尾、首、尾、的空格
开发语言·c#
yutian06068 小时前
C#: button 防止按钮在短时间内被连续点击的方法
开发语言·c#
初学者丶一起加油9 小时前
C语言基础:指针(常量指针和指针常量)
java·linux·c语言·开发语言·算法·ubuntu·visualstudio
一水鉴天10 小时前
智能工厂的设计软件 应用场景的一个例子: 为AI聊天工具添加一个知识系统 之21 项目主页:基于资源的交互系统--以RESTful 风格设计构建 聊天窗口
开发语言·c#