WPF通過反射機制動態加載控件

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窗體的功能。以下是實現過程的詳細解釋:

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65147.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65147.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65147.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

寬帶、光貓、路由器、WiFi、光纖之間的關系

1、寬帶&#xff08;Broadband&#xff09; 1.1 寬帶的定義寬帶指的是一種高速互聯網接入技術&#xff0c;通常包括ADSL、光纖、4G/5G等不同類型的接入方式。寬帶的關鍵特點是能夠提供較高的數據傳輸速率&#xff0c;使得用戶可以享受到穩定的上網體驗。 1.2 寬帶的作用寬帶是…

Pytest鉤子函數,測試框架動態切換測試環境

在軟件測試中&#xff0c;測試環境的切換是個令人頭疼的問題。不同環境的配置不同&#xff0c;如何高效切換測試環境成為許多測試開發人員關注的重點。你是否希望在運行測試用例時&#xff0c;能夠動態選擇測試環境&#xff0c;而不是繁瑣地手動修改配置&#xff1f; Pytest 測…

印象筆記07——試一試PDF標注

印象筆記07——試一試PDF標注 [!CAUTION] 根據第六期&#xff0c;我再次查詢了資料&#xff0c;印象筆記還是有一些可圈可點的功能的&#xff08;當然部分有平替&#xff09;&#xff0c;針對會員作用&#xff0c;開發使用場景雖然是逆向的&#xff0c;但我堅信這是一部分人的現…

【Vue】分享一個快速入門的前端框架以及如何搭建

先上效果圖: 登錄 菜單: 下載地址: 鏈接&#xff1a;https://pan.baidu.com/s/1m-ZlBARWU6_2n8jZil_RAQ 提取碼&#xff1a;ui20 … 主要是可以自定義設置token,更改后端請求地址較為方便。 應用設置: 登錄與token設置: 在這里設置不用登錄,可以請求的接口: request.js i…

通過串口通信控制led燈的亮滅

初始化led燈的gpio接口控制燈的亮滅 初始化uart1串口 將gpio9和gpio10設置為復用模式進行串口通信 通過串口的輸入輸出函數實現串口通信控制led燈的亮滅

計算機xinput1_4.dll丟失怎么修復?

電腦運行時常見問題及修復指南 作為軟件開發從業者&#xff0c;深知電腦在日常使用中難免會遇到各種問題&#xff0c;如文件丟失、文件損壞和系統報錯等。這些問題不僅影響工作效率&#xff0c;還可能帶來數據丟失的風險。本文將詳細介紹一些常見問題及其解決辦法&#xff0c;…

DeepSeek V3“報錯家門”:我是ChatGPT

搜 &#xff1a;海訊無雙Ai 要說這兩天大模型圈的頂流話題&#xff0c;那絕對是非DeepSeek V3莫屬了。 不過在網友們紛紛測試之際&#xff0c;有個bug也成了熱議的焦點—— 只是少了一個問號&#xff0c;DeepSeek V3竟然稱自己是ChatGPT。 甚至讓它講個笑話&#xff0c;生成…

C++:范圍for

范圍for&#xff08;range-based for&#xff09;是C的一種循環結構&#xff0c; 是在 C11 這個標準中引入的&#xff0c;這種類型的for循環使得遍歷數組、容器中的元素更加簡便和直觀。 一、范圍for語法 for ( 類型 變量名 : 數組名 ) 語句 //多條語句需要加?括號 示例&#…

C++基礎概念復習

前言 本篇文章作基礎復習用&#xff0c;主要是在C學習中遇到的概念總結&#xff0c;后續會繼續補充。如有不足&#xff0c;請前輩指出&#xff0c;萬分感謝。 1、什么是封裝&#xff0c;有何優點&#xff0c;在C中如何體現封裝這一特性&#xff1f; 封裝是面向對象編程&…

前端工程化之手搓webpack5 --【elpis全棧項目】

前端工程化之手搓webpack5 --【elpis全棧項目】 導讀 基本流程&#xff1a;輸入 – 編譯 – 輸出 #mermaid-svg-V8Gi7RFNikCuEhax {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-V8Gi7RFNikCuEhax .error-icon{fil…

vue3使用setup語法糖組件基礎傳值

(1)&#xff1a;defineProps&#xff1a;傳入要使用的props定義自定義屬性&#xff0c;傳遞過來的值具有響應式&#xff0c;和props一樣&#xff1b; (2)&#xff1a;defineEimts&#xff1a;傳入要自定義的事件&#xff0c;emit實例去傳入自定義事件的值&#xff0c;和$emit或…

S7-200可用的modbus RTU完成位輪詢

網上的信息比較散&#xff0c;官方說明也不充分&#xff0c;尤其是涉及主站按需寫入的部分沒有見到現成案例。 以下記錄完成位輪詢讀取&#xff0c;同時按需寫入的程序。 初始化主站&#xff0c;初始化塊的完成位M9.3通過上升沿觸發一個M9.4&#xff0c;用于后面啟動輪詢。 第…

特征點檢測與匹配——MATLAB R2022b

特征點檢測與匹配在計算機視覺中的作用至關重要,它為圖像處理、物體識別、增強現實等領域提供了堅實的基礎。 目錄 Harris角點檢測 SIFT(尺度不變特征變換) SURF(加速穩健特征) ORB(Oriented FAST and Rotated BRIEF) 總結 特征點檢測與匹配是計算機視覺中的一項基…

Vue3實現PDF在線預覽功能

?&#x1f308;個人主頁&#xff1a;前端青山 &#x1f525;系列專欄&#xff1a;Vue篇 &#x1f516;人終將被年少不可得之物困其一生 依舊青山,本期給大家帶來Vue篇專欄內容:Vue3現PDF在線預覽功能 前言 在開發中&#xff0c;PDF預覽和交互功能是一個常見的需求。無論是管理…

常用的EDA 工具

1&#xff09; 邏輯設計&#xff1a; Cadence 的Verilog XL ? 模擬電路設計&#xff1a; Mentor 的Viewdraw ? 電路合成&#xff1a; Synopsys 的Design Compiler ? 電路仿真&#xff1a; Synopsys 的Hsim 和Hspice ? 人工布局&#xff1a; Cadence 的Virtuso ? 自動布局…

基于ESP32的桌面小屏幕實戰[5]:PCB下單

1. 焊接調試前準備 PCB下單 點擊“PCB下單” 檢查一下DRC 確認無錯誤之后&#xff0c;確認下單 然后就會跳轉到下面的網頁 基本上保持默認選項即可。可以看到“焊盤噴鍍”有3個選項。 在選擇表面處理工藝時&#xff0c;應綜合考慮產品的具體需求、環保法規以及成本等因素。例…

云原生架構的演變與實踐

云原生架構的演變與實踐 在現代軟件開發的時代背景下&#xff0c;云原生架構日益成為推動業務轉型的關鍵。它以云為中心的應用架構和開發思維&#xff0c;不僅包括了容器化的基本形式&#xff0c;更涉及全方位的應用管理及優化。本文將圍繞云原生的特征、遷移步驟以及模式展開…

探索現代 Web 開發中的流行技術:深入學習 Vite 的使用

在前端開發的世界中&#xff0c;構建工具扮演著越來越重要的角色。從 Webpack 到 Parcel&#xff0c;再到 Rollup&#xff0c;每個工具都有自己的獨特定位和目標。而今天&#xff0c;我們要討論的是一款近年來迅速崛起并受到廣泛歡迎的構建工具— Vite。 本文將從基本原理到實…

如何通過 6 種方式將照片從 iPhone 傳輸到戴爾 PC?

“你知道如何將iPhone上的照片轉移到電腦上嗎&#xff1f;我的iPhone上有很多照片&#xff0c;所以我想將這些照片從iPhone轉移到電腦上。請給我一些建議&#xff0c;謝謝&#xff01;” - Nirenling 在戴爾社區中發布 您的iPhone是否被各種精彩的照片和視頻占滿而存儲空間不…

『SQLite』表達式操作

摘要&#xff1a;表達式是一個或多個值、運算符和計算值的 SQL 函數的組合。SQL 表達式與公式類似&#xff0c;都寫在查詢語言中。 基本語法 SELECT column1, column2, columnN FROM table_name WHERE [CONTION | EXPRESSION];布爾表達式 SQLite 的布爾表達式在匹配單個值的…