一文讀懂WPF系列之常用控件以及樣式

WPF控件

    • 控件分類概覽
      • 常用控件
      • 常用控件代碼示例和效果
    • 樣式與模板應用
      • 樣式定義??方式
        • 行內樣式??
        • 頁面/窗口級資源樣式(Local Resource)
        • 應用程序全局資源
        • 獨立資源字典(ResourceDictionary)
        • 控件模板(ControlTemplate)
        • 主題樣式(Themes)
      • 樣式繼承
      • 樣式的優先級規則??

控件分類概覽

在這里插入圖片描述
布局控件上一篇文章單獨講了,這篇就主要講其他類型的控件
在這里插入圖片描述

常用控件

  1. 內容控件??
    ??Button??:觸發操作,可通過Content屬性嵌入任意內容(如文本、圖標)。
    ??Label??/??TextBlock??:顯示文本,前者支持快捷鍵綁定,后者輕量級。
  2. 條目控件??
    ??ListBox??/??ComboBox??:顯示列表數據,支持數據綁定和模板定制。
    ??DataGrid??:表格控件,支持排序、分頁和復雜數據展示。
  3. 輸入控件??
    ??TextBox??:單行文本輸入。
    RichTextBox:支持富文本格式(字體、顏色、段落)。
    ??PasswordBox??:密碼輸入,隱藏明文。
    ??CheckBox??/??RadioButton??:多選和單選控件。
  4. ??特殊容器??
    ??TabControl??:分頁顯示,通過TabItem管理多視圖。
    ??Expander??:可折疊面板,節省空間

常用控件代碼示例和效果

其實主要需要理解的是TabControl 與 Expander 其他控件比較簡單易懂,這個例子看懂了基本上對于布局以及控件的常用基礎就差不多了,如果需求用到不常用的也可以單獨在去查看使用。

 <Grid Margin="10"><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><!-- 頂部工具欄 --><StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,0,0,10"><Button Content="點擊我" Click="Button_Click" Width="80" Margin="0,0,5,0"/><Label Content="用戶名:" VerticalAlignment="Center"/><TextBox Width="120" Margin="5,0" Text="測試管理員"/><PasswordBox Width="120" Margin="5,0" PasswordChar="*"/></StackPanel><!-- 主內容區 --><TabControl Grid.Row="1"><TabItem Header="數據展示"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="2*"/></Grid.ColumnDefinitions><!-- 左側選項 --><StackPanel Grid.Column="0" Margin="0,0,10,0"><GroupBox Header="選項設置"><StackPanel Margin="5"><CheckBox Content="啟用功能" Margin="0,5"/><RadioButton Content="模式A" GroupName="Mode" Margin="0,5"/><RadioButton Content="模式B" GroupName="Mode" Margin="0,5"/><Expander Header="高級選項"><StackPanel Margin="10,5"><TextBox Text="參數1"/><TextBox Text="參數2" Margin="0,5"/></StackPanel></Expander></StackPanel></GroupBox></StackPanel><!-- 中間分隔線 --><GridSplitter Grid.Column="1" Width="3" HorizontalAlignment="Center"/><!-- 右側表格 --><DataGrid Grid.Column="2" AutoGenerateColumns="False"ItemsSource="{Binding DataItems}"><DataGrid.Columns><DataGridTextColumn Header="ID" Binding="{Binding Id}"/><DataGridTextColumn Header="名稱" Binding="{Binding Name}"/><DataGridCheckBoxColumn Header="狀態" Binding="{Binding IsActive}"/></DataGrid.Columns></DataGrid></Grid></TabItem><TabItem Header="列表控件"><StackPanel Margin="10"><ListBox Height="150" ItemsSource="{Binding Items}"/><ComboBox Margin="0,10" ItemsSource="{Binding Items}" SelectedIndex="0"/></StackPanel></TabItem></TabControl><!-- 底部狀態欄 --><StatusBar Grid.Row="2"><StatusBarItem Content="就緒"/><Separator/><StatusBarItem Content="當前用戶: Admin"/></StatusBar></Grid>
 public partial class MainWindow : Window{public MainWindow(){InitializeComponent();DataContext = this;}public ObservableCollection<string> Items { get; } = new ObservableCollection<string>{"選項一", "選項二", "選項三"};public ObservableCollection<DataItem> DataItems { get; } = new ObservableCollection<DataItem>{new DataItem { Id = 1, Name = "項目A", IsActive = true },new DataItem { Id = 2, Name = "項目B", IsActive = false }};private void Button_Click(object sender, RoutedEventArgs e){MessageBox.Show("按鈕被點擊!");}}public class DataItem{public int Id { get; set; }public string Name { get; set; }public bool IsActive { get; set; }}

在這里插入圖片描述

在這里插入圖片描述

樣式與模板應用

WPF通過樣式(Style)和模板(Template)實現界面統一與定制

樣式定義??方式

在這里插入圖片描述

行內樣式??

直接設置控件屬性(如Background=“Blue”),適用于局部簡單調整。

<Button Content="臨時按鈕" Background="Red" Foreground="White"/>
頁面/窗口級資源樣式(Local Resource)

在 Window 或 Page 的 Resources 中定義樣式 適用于當前頁
??<Button.Style> 這種標簽里面寫style(資源式樣式)

<Window.Resources><Style x:Key="CustomButton" TargetType="Button"><Setter Property="Background" Value="#0078D4"/><Setter Property="Foreground" Value="White"/><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="Background" Value="#005A9E"/></Trigger></Style.Triggers></Style>
</Window.Resources>
<Button Style="{StaticResource CustomButton}" Content="按鈕"/>
應用程序全局資源

在 App.xaml 的 Application.Resources 中定義樣式 適用全局

<!-- App.xaml -->
<Application.Resources><Style x:Key="GlobalButton" TargetType="Button"><Setter Property="Margin" Value="10"/><Setter Property="Padding" Value="8"/></Style>
</Application.Resources><!-- 任意頁面使用 -->
<Button Style="{StaticResource GlobalButton}" Content="全局按鈕"/>
獨立資源字典(ResourceDictionary)

將樣式拆分到獨立 XAML 文件,通過合并字典引用,大型項目模塊化樣式管理

創建 Styles/Buttons.xaml
<ResourceDictionary><Style x:Key="SuccessButton" TargetType="Button"><Setter Property="Background" Value="#4CAF50"/></Style>
</ResourceDictionary>在 App.xaml 中合并
<Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Styles/Buttons.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary>
</Application.Resources>
控件模板(ControlTemplate)

通過 ControlTemplate 完全重構控件視覺樹。
??適用場景??:需要徹底改變控件外觀(如圓形按鈕)

資源字典中(推薦)
<!-- 在Window.Resources或App.xaml中定義 --><Window.Resources><Style TargetType="Button"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Grid><!-- 自定義外觀 --><Ellipse Fill="{TemplateBinding Background}"/><ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/></Grid></ControlTemplate></Setter.Value></Setter></Style></Window.Resources>單個控件內
<Button Content="臨時按鈕"><Button.Template><ControlTemplate TargetType="Button"><Border Background="Red"/></ControlTemplate></Button.Template>
</Button>

TargetType:指定模板適用的控件類型(如 Button、CheckBox)。
TemplateBinding:將模板元素的屬性綁定到控件的依賴屬性(如 Background、Foreground)。
ContentPresenter:占位符,用于顯示控件的Content 屬性(如按鈕文本)

主題樣式(Themes)

通過 ThemeInfo 和主題資源字典實現動態換膚
??適用場景??:需要支持多套主題切換(如白天/夜間模式)

在 App.xaml.cs 中設置主題
public partial class App : Application
{public void ChangeTheme(string themeName){Resources.MergedDictionaries.Clear();Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri($"/Themes/{themeName}.xaml", UriKind.Relative) });}
}
創建主題文件 Themes/Dark.xaml
<ResourceDictionary><Style TargetType="Button"><Setter Property="Background" Value="#333333"/></Style>
</ResourceDictionary>

樣式繼承

通過 BasedOn 復用基礎樣式??

<Style TargetType="Button" x:Key="PrimaryButton"><Setter Property="Background" Value="#2196F3"/>
</Style><Style TargetType="Button" x:Key="DangerButton" BasedOn="{StaticResource PrimaryButton}"><Setter Property="Background" Value="#F44336"/>
</Style>

樣式的優先級規則??

當直接設置屬性和樣式沖突時,優先級順序如下:
控件直接設置屬性 > 顯式樣式(Style) > 隱式樣式(無x:Key的樣式) > 控件默認樣式
?隱式樣式的作用域??
無 x:Key 的

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

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

相關文章

AndroidTV D貝桌面-v3.2.5-[支持文件傳輸]

AndroidTV D貝桌面 鏈接&#xff1a;https://pan.xunlei.com/s/VONXSBtgn8S_BsZxzjH_mHlAA1?pwdzet2# AndroidTV D貝桌面-v3.2.5[支持文件傳輸] 第一次使用的話&#xff0c;壁紙默認去掉的&#xff0c;不需要按遙控器上鍵&#xff0c;自己更換壁紙即可

XDocument和XmlDocument的區別及用法

因為這幾天用到了不熟悉的xml統計數據&#xff0c;啃了網上的資料解決了問題&#xff0c;故總結下xml知識。 1.什么是XML?2.XDocument和XmlDocument的區別3.XDocument示例1示例2&#xff1a;示例3&#xff1a; 4.XmlDocument5.LINQ to XML6.XML序列化(Serialize)與反序列化(De…

從競速到巡檢:不同無人機如何匹配最佳PCB方案?

隨著無人機技術的快速發展&#xff0c;高性能PCB&#xff08;印刷電路板&#xff09;成為無人機制造商的核心需求之一。無論是消費級無人機還是工業級應用&#xff0c;PCB的質量直接影響飛行控制、信號傳輸和整機穩定性。那么&#xff0c;無人機制造商在選型高端PCB時&#xff…

高支模自動化監測解決方案

1.行業現狀 高大模板支撐系統在澆筑施工過程中&#xff0c;諸多重大安全風險點進行實時自動化安全監測的解決方案主要監測由于頂桿失穩、扣件失效、承壓過大等引起的支撐軸力、模板沉降、相對位移、支撐體系傾斜等參數變化。系統采用無線自動組網、高頻連續采樣&#xff0c;實時…

python【標準庫】multiprocessing

文章目錄 介紹多進程Process 創建子進程共享內存數據多進程通信Pool創建子進程多進程案例多進程注意事項介紹 python3.10.17版本multiprocessing 是一個多進程標準模塊,使用類似于threading模塊的API創建子進程,充分利用多核CPU來并行處理任務。提供本地、遠程的并發,高效避…

UniApp基于xe-upload實現文件上傳組件

xe-upload地址&#xff1a;文件選擇、文件上傳組件&#xff08;圖片&#xff0c;視頻&#xff0c;文件等&#xff09; - DCloud 插件市場 致敬開發者&#xff01;&#xff01;&#xff01; 感覺好用的話&#xff0c;給xe-upload的作者一個好評 背景&#xff1a;開發中經常會有…

STM32 HAL庫之GPIO示例代碼

LED燈不斷閃爍 GPIO初始化&#xff0c;main文件中的 MX_GPIO_Init(); 也就是在 gpio.c文件中 void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOE_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOA_C…

二維數點 系列 題解

1.AT_dp_w Intervals 我的博客 2.CF377D Developing Games 我的博客 這兩道題是比較經典的線段樹區間 trick&#xff0c;希望自己可以在以后的比賽中手切。 3.洛谷 P10814 離線二維數點 題意 給你一個長為 n n n 的序列 a a a&#xff0c;有 m m m 次詢問&#xff0c…

vulkanscenegraph顯示傾斜模型(5.9)-vsg中vulkan資源的編譯

前言 上一章深入剖析了GPU資源內存及其管理&#xff0c;vsg中為了提高設備內存的利用率&#xff0c;同時減少內存(GPU)碎片&#xff0c;采用GPU資源內存池機制(vsg::MemoryBufferPools)管理邏輯緩存(VkBuffer)與物理內存(VkDeviceMemory)。本章將深入vsg中vulkan資源的編譯(包含…

探秘 Python 網絡編程:構建簡單聊天服務器

在計算機網絡的世界里&#xff0c;網絡編程是實現不同設備之間通信的關鍵技術。Python 憑借其簡潔的語法和強大的庫支持&#xff0c;在網絡編程領域有著廣泛的應用。無論是構建簡單的聊天服務器&#xff0c;還是開發復雜的網絡應用&#xff0c;Python 都能輕松勝任。 1 理論基礎…

Go語言Slice切片底層

Go語言&#xff08;Golang&#xff09;中切片&#xff08;slice&#xff09;的相關知識、包括切片與數組的關系、底層結構、擴容機制、以及切片在函數傳遞、截取、增刪元素、拷貝等操作中的特性。并給出了相關代碼示例和一道面試題。關鍵要點包括&#xff1a; 數組特性&#xf…

vue3 ts 自定義指令 app.directive

在 Vue 3 中&#xff0c;app.directive 是一個全局 API&#xff0c;用于注冊或獲取全局自定義指令。以下是關于 app.directive 的詳細說明和使用方法 app.directive 用于定義全局指令&#xff0c;這些指令可以用于直接操作 DOM 元素。自定義指令在 Vue 3 中非常強大&#xff0…

基于python的機器學習(五)—— 聚類(二)

一、k-medoids聚類算法 k-medoids是一種聚類算法&#xff0c;它是基于k-means聚類算法的一種改進。k-medoids算法也是一種迭代算法&#xff0c;但是它將中心點限定為數據集中的實際樣本點&#xff0c;而不是任意的點。 具體來說&#xff0c;k-medoids算法從數據集中選擇k個初…

解釋:指數加權移動平均(EWMA)

指數加權移動平均&#xff08;EWMA, Exponential Weighted Moving Average&#xff09; 是一種常用于時間序列平滑、異常檢測、過程控制等領域的統計方法。相比普通移動平均&#xff0c;它對最近的數據賦予更高權重&#xff0c;對舊數據逐漸“淡化”。 ? 一、通俗理解 想象你…

Spring Boot 項目基于責任鏈模式實現復雜接口的解耦和動態編排!

全文目錄&#xff1a; 開篇語前言一、責任鏈模式概述責任鏈模式的組成部分&#xff1a; 二、責任鏈模式的核心優勢三、使用責任鏈模式解耦復雜接口1. 定義 Handler 接口2. 實現具體的 Handler3. 創建訂單對象4. 在 Spring Boot 中使用責任鏈模式5. 配置責任鏈6. 客戶端調用 四、…

COMSOL仿真遇到的兩個小問題

最近跑熱仿真的時候跑出了兩個問題&#xff0c;上網查發現也沒什么解決方式&#xff0c;最后自己誤打誤撞的摸索著解決了&#xff0c;在這里分享一下。 問題一 我當時一準備跑仿真就彈出了這個東西&#xff0c;但在此之前從未遇到 然后我試著在它說的路徑中建立recoveries文件…

如何在英文學術寫作中正確使用標點符號?

標點符號看似微不足道&#xff0c;但它們是書面語言的無名英雄。就像熟練的指揮家指揮管弦樂隊一樣&#xff0c;標點符號可以確保您的寫作流暢、傳達正確的含義并引起讀者的共鳴。正如放錯位置的音符會在音樂中造成不和諧一樣&#xff0c;放錯位置的逗號或缺少分號也會使您的寫…

【深度學習與大模型基礎】第10章-期望、方差和協方差

一、期望 ——————————————————————————————————————————— 1. 期望是什么&#xff1f; 期望&#xff08;Expectation&#xff09;可以理解為“長期的平均值”。比如&#xff1a; 擲骰子&#xff1a;一個6面骰子的點數是1~6&#x…

JAVA虛擬機(JVM)學習

入門 什么是JVM JVM&#xff1a;Java Virtual Machine&#xff0c;Java虛擬機。 JVM是JRE(Java Runtime Environment)的一部分&#xff0c;安裝了JRE就相當于安裝了JVM&#xff0c;就可以運行Java程序了。JVM的作用&#xff1a;加載并執行Java字節碼&#xff08;.class&#…

【數據結構與算法】——堆(補充)

前言 上一篇文章講解了堆的概念和堆排序&#xff0c;本文是對堆的內容補充 主要包括&#xff1a;堆排序的時間復雜度、TOP 這里寫目錄標題 前言正文堆排序的時間復雜度TOP-K 正文 堆排序的時間復雜度 前文提到&#xff0c;利用堆的思想完成的堆排序的代碼如下&#xff08;包…