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"按钮时,触发了TLButtom的OnClick事件处理程序。
    • 该事件处理程序依据SubTLWindows属性的值(这里是Suggestion窗口的类型),创建了一个新的Suggestion窗口实例,并将其显示出来。
相关推荐
昂好的day1 小时前
VisionMaster 通信模块实战(上):Modbus、TCP 收发、协议组装解析
开发语言·网络·网络协议·tcp/ip·c#
波力海苔夹心脆6754 小时前
C# 正则表达式零基础入门:从“看得懂“到“会用“
经验分享·后端·mysql·正则表达式·c#
昂好的day6 小时前
VisionMaster(VM) 标定工具详解(上):为什么必须标定 + 九点标定手眼标定
开发语言·数码相机·c#
小羊没烦恼!11 小时前
深入浅出SQL Server中的死锁
java·开发语言·前端·数据库·后端·spring·c#
czhc114007566319 小时前
同值短路与单一真值源:属性不是命令,状态只有一个家
c#
下页、再停留1 天前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
波力海苔夹心脆6751 天前
VisionMaster 两级位置修正实战:塑料外壳与金属件装配角度检测
经验分享·计算机视觉·c#·visionmaster·海康机器人·位置修正
小羊没烦恼!1 天前
C#综合揭秘——Entity Framework 并发处理详解
java·开发语言·前端·javascript·数据库·mysql·c#
淡海水1 天前
05-02-源码-Boehm GC标记阶段
算法·unity·c#·游戏引擎·gc