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窗口实例,并将其显示出来。
相关推荐
技术支持者python,php1 小时前
winform本地上位机-ModbusRTC1.上位机控制台与数据监控(数据监控架构思维与图表系列)
c#
Pota-to成长日记2 小时前
Redisson 看门狗机制深度解析:分布式锁的守护者
分布式·wpf
为java加瓦2 小时前
分布式单例模式在微服务架构中的关键作用与实践
wpf
c#上位机3 小时前
wpf之Ellipse控件
wpf
kalvin_y_liu3 小时前
DeploySharp开源发布:让C#部署深度学习模型更加简单
深度学习·开源·c#
c#上位机4 小时前
wpf之GroupBox
c#·wpf
CodeCraft Studio4 小时前
国产化PDF处理控件Spire.PDF教程:C#中轻松修改 PDF 文档内容
前端·pdf·c#·.net·spire.pdf·编辑pdf·修改pdf
mit6.8245 小时前
[C# starter-kit] Domain Entities | `AuditableEntity`基类 | 跟踪变化 | 软删除
数据库·microsoft·c#
李宥小哥11 小时前
C#基础11-常用类
android·java·c#
偶尔的鼠标人13 小时前
Avalonia中,使用DataTable类型作为DataGrid的ItemSource 数据源
ui·c#·avalonia