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
窗口實例,并將其顯示出來。
- 當用戶點擊