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窗口实例,并将其显示出来。
相关推荐
人工智能AI技术3 小时前
315曝光AI投毒!用C#构建GEO污染检测与数据安全防护方案
人工智能·c#
金山几座5 小时前
C#学习记录-事件
开发语言·学习·c#
我是唐青枫9 小时前
C#.NET ReadOnlySequence 深入解析:多段内存遍历与零拷贝协议解析
网络·c#·.net
人工智能AI技术10 小时前
GTC炸场!C#集成NemoClaw企业级Agent实战教程
人工智能·c#
金币闪耀10 小时前
一种winform实时刷新日志内容的方法
c#
Vae_Mars11 小时前
华睿MVP:C#脚本的应用一
笔记·c#
筱璦12 小时前
期货软件开发「启动加载页 / 初始化窗口」
前端·c#·策略模式·期货
qq_3907603912 小时前
简单的线程安全日志记录器
开发语言·数据库·c#
醉酒柴柴13 小时前
word创建样式以后应用于所有新文件
开发语言·学习·c#·word
JosieBook14 小时前
【WinForm】C# WinForms 跨线程更新 UI 避坑指南
开发语言·ui·c#