WPF中Style和Template異同

在WPF(Windows Presentation Foundation)中,StyleTemplate是兩個核心概念,用于控制UI元素的外觀和行為,但它們的職責和使用場景有明顯區別。以下是詳細分析:

一、基本概念

1. Style(樣式)
  • 定義:Style是一組屬性值的集合,用于統一設置控件的外觀和行為屬性(如顏色、字體、邊距等)。
  • 作用:簡化重復屬性設置,提高代碼復用性。
  • 示例
    <Style TargetType="Button"><Setter Property="Background" Value="Blue"/><Setter Property="Foreground" Value="White"/>
    </Style>
    
2. Template(模板)
  • 定義:Template是控件的視覺樹(VisualTree)的完整定義,用于徹底改變控件的結構和外觀。
  • 作用:自定義控件的內部結構(如按鈕的點擊區域、文本位置等)。
  • 示例
    <ControlTemplate TargetType="Button"><Border Background="{TemplateBinding Background}"><ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/></Border>
    </ControlTemplate>
    

二、核心區別

對比項StyleTemplate
操作對象控件的屬性值(如BackgroundWidth控件的視覺結構(VisualTree)
修改深度表層屬性,不改變控件內部結構徹底重構控件的視覺表現
繼承關系可基于父Style繼承和擴展需重新定義整個視覺樹
使用場景統一外觀(如主題、配色方案)自定義控件形態(如圓形按鈕、帶圖標的文本框)
典型屬性SetterTriggerControlTemplateDataTemplate

三、使用場景

1. Style的適用場景
  • 統一主題:為所有按鈕、文本框等設置一致的外觀。

    <!-- 全局按鈕樣式 -->
    <Style TargetType="Button"><Setter Property="Background" Value="#3498db"/><Setter Property="Foreground" Value="White"/><Setter Property="FontSize" Value="14"/>
    </Style>
    
  • 屬性復用:提取公共屬性為獨立資源。

    <Style x:Key="TextBoxBaseStyle" TargetType="TextBox"><Setter Property="Padding" Value="5"/><Setter Property="BorderBrush" Value="#CCCCCC"/>
    </Style>
    
  • 條件樣式:通過Trigger實現狀態變化(如鼠標懸停效果)。

    <Style TargetType="Button"><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="Background" Value="#2980b9"/></Trigger></Style.Triggers>
    </Style>
    
2. Template的適用場景
  • 自定義控件結構:例如創建無邊框按鈕,或在按鈕中添加圖標。

    <ControlTemplate TargetType="Button"><Border x:Name="border" Background="{TemplateBinding Background}"><StackPanel Orientation="Horizontal"><Image Source="icon.png"/><ContentPresenter/></StackPanel></Border>
    </ControlTemplate>
    
  • 數據可視化:使用DataTemplate定義數據項的展示方式。

    <DataTemplate DataType="{x:Type local:Person}"><StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Name}"/><TextBlock Text="{Binding Age}" Margin="5,0"/></StackPanel>
    </DataTemplate>
    
  • 復雜交互邏輯:例如自定義滑塊(Slider)的滑動區域。

    <ControlTemplate TargetType="Slider"><Grid><Track x:Name="PART_Track"><Track.Thumb><Thumb Background="Red" Width="20" Height="20"/></Track.Thumb></Track></Grid>
    </ControlTemplate>
    

四、結合使用

Style和Template通常結合使用,Style可包含對Template的引用,實現外觀和結構的雙重定制:

<Style TargetType="Button"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Border Background="{TemplateBinding Background}"><ContentPresenter/></Border></ControlTemplate></Setter.Value></Setter>
</Style>

五、總結

  • Style 是屬性的集合,用于批量設置控件的外觀屬性,適合統一主題和簡化重復代碼。
  • Template 是控件的視覺藍圖,用于徹底改變控件的結構和行為,適合高級自定義場景。
  • 選擇原則
    • 若只需修改控件的表層屬性(如顏色、字體),使用 Style
    • 若需重新定義控件的內部結構(如布局、子元素),使用 Template

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

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

相關文章

針對 DVWA 中 Command Injection 模塊的亂碼問題及解決辦法

目錄 根本原因 解決辦法 優化說明 適用范圍 系統兼容性 在 DVWA 的 Command Injection 模塊中執行系統命令時&#xff0c;返回結果出現亂碼&#xff08;如圖1所示&#xff09;。 根本原因 DVWA 默認使用 UTF-8 編碼&#xff0c;而部分系統命令&#xff08;如 Windows 的…

Linux獲取ImageNet數據集方法及小規模imagenet

一、數據集下載 ImageNet官方鏈接&#xff1a;ImageNet Linux命令直接下載&#xff1a; 訓練集 wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train.tar --no-check-certificate驗證集 wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_val.t…

JAVA八股文:異常有哪些種類,可以舉幾個例子嗎?Throwable類有哪些常見方法?

Throwable、Error 與 Exception 所有的異常類型都繼承自 java.lang.Throwable。 其中 Error&#xff08;比如 OutOfMemoryError、StackOverflowError、類加載失敗等&#xff09;表示 JVM 自身或運行環境的問題&#xff0c;不應該也通常無法由應用程序去捕獲或恢復&#xff0c;…

.NetCore+Vue快速生產框架開發詳細方案

文章目錄 1. 項目概述 1.1 項目背景1.2 項目目標1.3 核心功能 2. 技術棧選擇 2.1 后端技術棧2.2 前端技術棧2.3 開發工具 3. 系統架構設計 3.1 整體架構3.2 后端架構設計3.3 前端架構設計3.4 微服務考慮 4. 后端.NET核心設計 4.1 項目結構4.2 核心模塊設計4.2.1 用戶模塊4.2.2 …

WPF學習筆記(18)觸發器Trigger

觸發器 1. 概述2. 詳解2.1. Trigger 用法2.2. MultiTrigger 用法2.3. DataTrigger 用法2.4. EventTrigger 用法 總結 1. 概述 官方文檔&#xff1a;https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.trigger?viewnetframework-4.8 2. 詳解 在Style中可以指定觸…

記本好書:矩陣力量:線性代數全彩圖解+微課+Python編程

書名&#xff1a;矩陣力量&#xff1a;線性代數全彩圖解微課Python編程 作者&#xff1a;姜偉生 出版社&#xff1a;清華大學出版社 出版時間&#xff1a;2023-06-01 ISBN&#xff1a;9787302632511 品牌方&#xff1a;清華大學出版社有限公司 發現一本好書&#xff0c;但是一…

?Webpack打包流程

Webpack打包流程的核心步驟包括初始化配置、解析入口文件、構建依賴圖、模塊轉換、資源優化和輸出文件?。該流程通過遞歸分析模塊依賴關系&#xff0c;結合加載器和插件處理各類資源&#xff0c;最終生成優化后的靜態文件。 ?核心流程概述? ?初始化配置?&#xff1a;讀取…

入門pytorch-聯邦學習

本文聯邦學習的代碼引用于https://github.com/shaoxiongji/federated-learning 本篇文章相當于帶大家讀一遍聯邦學習的代碼&#xff0c;同時加深了大家對聯邦學習和Pytorch框架的理解。 這里想簡單介紹一下聯邦學習。 聯邦學習說白了&#xff0c;就是假如有 N N N個數據擁有…

半導體和PN結

1. 什么是半導體&#xff1f; 導體&#xff0c;電阻率小&#xff0c;即電流容易通過的材料&#xff1b;Cu 絕緣體&#xff0c;導電性低&#xff0c;即電流不易通過的材料&#xff1b;塑料 半導體&#xff0c;常溫下導電性能介于導體和絕緣體之間&#xff0c;是一種導電可控的…

如何分析大語言模型(LLM)的內部表征來評估文本的“誠實性”

如何分析大語言模型(LLM)的內部表征來評估文本的“誠實性” 基于這樣一個假設:模型在生成誠實和不誠實回答時,其內部狀態會存在系統性差異 LAT :線性人工斷層掃描 我們通過一個生活化的例子來理解如何通過分析大語言模型的內部表征評估文本的“誠實性”。 場景類比:判…

【算法】動態規劃 矩陣 :62. 不同路徑

62. 不同路徑 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&…

LabVIEW調用Excel宏實現數據可視化

通過LabVIEW 的 ActiveX 接口&#xff0c;調用 Excel 應用程序&#xff0c;實現打開指定Excel 工作簿并運行其中宏&#xff08;如 “GraphData” 宏&#xff09;&#xff0c;將工作表數據以圖表形式展示。通過 ActiveX 自動化技術&#xff0c;打通 LabVIEW 與 Excel 交互通道&a…

初始CNN(卷積神經網絡)

卷積神經網絡&#xff08;Convolutional Neural Network&#xff0c;簡稱 CNN&#xff09;作為深度學習的重要分支&#xff0c;在圖像識別、目標檢測、語義分割等領域大放異彩。無論是手機上的人臉識別解鎖&#xff0c;還是自動駕駛汽車對道路和行人的識別&#xff0c;背后都離…

深度解析Spring Bean生命周期:從字節碼到可用對象的奇幻旅程

&#x1f331; 深度解析Spring Bean生命周期&#xff1a;從字節碼到可用對象的奇幻旅程 你是否曾困惑&#xff1a;為什么PostConstruct有時不執行&#xff1f;為什么循環依賴報錯如此難解&#xff1f;為什么AOP代理在某些場景失效&#xff1f; 本文將徹底拆解Spring Bean的16個…

MySQL 復合查詢和內外連接 -- 子查詢,多表查詢,自連接,合并查詢,表的內外連接

目錄 1. 子查詢 1.1 單行子查詢 1.2 多行子查詢 1.3 多列子查詢 1.4 在 from 子句中使用子查詢 2. 多表查詢 3. 自連接 4. 合并查詢 4.1 union 4.2 union all 5. 表的內連接 6. 表的外連接 下列先給出該博客中所用到的所有表的數據。 &#xff08;1&#xff09;部…

【STM32+LAN9252+HAL庫】EtherCAT從站搭建 保姆級教程

目錄 一、生成協議棧及XML文件 二、使用stm32CuboMX配置外設 三、協議棧移植 鑒于本人對EtherCAT的掌握程度十分有限&#xff0c;這篇文章僅作為我搭建基礎從站的過程記錄不做更多講解。本文內容主要為SPI模式的基礎搭建&#xff0c;更多深入的學習資料和細節&#xff0c;大家…

【LeetCode 熱題 100】239. 滑動窗口最大值——(解法二)滑動窗口+單調隊列

Problem: 239. 滑動窗口最大值 題目&#xff1a;給你一個整數數組 nums&#xff0c;有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。返回滑動窗口中的最大值 。 【LeetCode 熱題 100】239. 滑…

MySQL 8.0 連接 5.x 服務器認證問題

總的來說&#xff0c;答案是&#xff1a;可以&#xff0c;但是需要特別注意認證方式的兼容性問題。 MySQL 8.0 引入了新的默認認證插件 caching_sha2_password&#xff0c;而 MySQL 5.x&#xff08;及更早版本&#xff09;使用的是 mysql_native_password。當你用一個 8.0 的客…

Spring原理揭秘(一)

什么是spring&#xff1f; spring框架是一個輕量級的開源的JavaEE框架。 所謂輕量級則是&#xff1a;占用空間小&#xff0c;代碼侵入性低&#xff0c;代碼耦合度低&#xff0c;降低代碼復雜度&#xff0c;可以輕易適配多種框架。 隨著spring的不斷發展&#xff0c;它所占用…

Visual Studio Code自用搜索技巧整理

多文件跨行搜索 用途 在多個日志文件中搜索跨行日志 方法 1.用VS Code打開待搜索文件所在的目錄&#xff1b; 2.按快捷鍵&#xff08;CtrlShiftF&#xff09;打開全局搜索&#xff1b; 3.點擊搜索框右側的開啟正則表達式&#xff1b; 4.輸入正則表達式&#xff0c;例如&…