Activator.CreateInstance
是 .NET 提供的一个静态方法,它属于 System
命名空间。此方法通过反射机制根据提供的类型信息。
写一个小demo演示一下
要求:在用户反馈界面点击建议或者评分按钮 弹出相应界面
编写MainWindow.xmal 主窗体
<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
对象传递过去,
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 则不会抛出异常。}
}
编写子窗体
<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
窗体的功能。以下是实现过程的详细解释:
- 定义自定义控件:
-
- 在
WpfXMAL.UC
命名空间中,定义了一个名为TLButtom
的类,它继承自Button
。 TLButtom
类添加了一个属性SubTLWindows
,其类型是Type
。这个属性用来指定当按钮被点击时应该实例化并显示的窗口类型。
- 在
- 覆写按钮点击事件:
-
- 在
TLButtom
类中,重写了OnClick
方法。当按钮被点击时,会调用这个方法。 - 在
OnClick
方法内,使用Activator.CreateInstance
方法和SubTLWindows
属性值来创建一个新的窗口实例。这里利用了反射机制,根据类型信息动态地创建对象。 - 创建完窗口实例后,检查是否成功创建(即不为null),然后调用
Show
方法将新窗口显示给用户。
- 在
- 在XAML中配置按钮:
-
- 在
MainWindow.xaml
文件中,有两个TLButtom
控件,每个控件都设置了Content
属性(按钮上显示的文字)和SubTLWindows
属性。 - 对于“Suggestion”按钮,
SubTLWindows
属性设置为{x:Type TypeName=SubFrm:Suggestion}
,这告诉TLButtom
控件,当这个按钮被点击时,应该创建并显示Suggestion
类型的窗口。
- 在
- 运行逻辑:
-
- 当用户点击
MainWindow
中的“Suggestion”按钮时,触发了TLButtom
的OnClick
事件处理程序。 - 该事件处理程序依据
SubTLWindows
属性的值(这里是Suggestion
窗口的类型),创建了一个新的Suggestion
窗口实例,并将其显示出来。
- 当用户点击