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窗口实例,并将其显示出来。
相关推荐
虚假程序设计10 分钟前
python用 PythonNet 从 Python 调用 WPF 类库 UI 用XAML
python·ui·wpf
Aimeast2 小时前
关于选择最佳.NET Core SSH服务器库的全面分析
c#·ssh
落落落sss2 小时前
MongoDB
数据库·windows·redis·mongodb·微服务·wpf
蒋劲豪3 小时前
WPF项目暴露WebApi接口;WinForm项目暴露WebApi接口;C#项目暴露WebApi接口;
开发语言·c#·wpf
code bean4 小时前
【C# 数据结构】队列 FIFO
开发语言·数据结构·c#
时光追逐者6 小时前
推荐几款开源免费的 .NET MAUI 组件库
microsoft·开源·c#·.net·.net core·maui
软件黑马王子8 小时前
C#初级教程(1)——C# 与.NET 框架:探索微软平台编程的强大组合
开发语言·c#
shepherd枸杞泡茶8 小时前
第3章 3.2 配置系统 .NET Core配置系统
后端·c#·asp.net·.net
让我们一起加油好吗9 小时前
【数学】数论干货(疑似密码学基础)
c语言·visualstudio·密码学
编程乐趣10 小时前
一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略来了!
开发语言·c#