WPF入門 #1 WPF布局基礎、WPF樣式基礎、WPF數據模板、WPF綁定

WPF當中有許多的布局容器控件,例如<Grid>、<StackPanel>、<WrapPanel>、<DockPanel>、<UniformGrid>。接下來分別介紹一下各個布局容器控件。

布局基礎

Grid

<Grid><Grid.RowDefinitions><RowDefinition Height="2*"/><RowDefinition/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="2*"/><ColumnDefinition/></Grid.ColumnDefinitions><Border Grid.Row="0" Grid.Column="0" Background="Red"/><Border Grid.Row="0" Grid.Column="1" Background="Yellow"/><Border Grid.Row="1" Grid.Column="0" Background="Blue"/><Border Grid.Row="1" Grid.Column="1" Background="Green"/>
</Grid>

Grid中的元素還可以跨行和跨列:

StackPanel

StackPanel默認水平排列,具有?Orientation=""屬性可以改變排列方向。

WrapPanel

WrapPanel默認水平排列,也具有?Orientation=""屬性可以改變排列方向。

DockPanel

DockPanel具有停靠的功能,位于DockPanel中的元素,可以設置它的方向。

UniformGrid

這個容器最大的作用就是在有限的空間里面均分剩余空間。

下面對一個頁面進行布局模擬練習:

<Grid><Grid.RowDefinitions><RowDefinition Height="80"/><RowDefinition/></Grid.RowDefinitions><Border Background="#FFECF1"/><Grid Grid.Row="1"><Grid.ColumnDefinitions><ColumnDefinition Width="200"/><ColumnDefinition/></Grid.ColumnDefinitions><Border Background="#FF7F24"/><Grid Grid.Column="1" Margin="5"><Grid.RowDefinitions><RowDefinition Height="100"/><RowDefinition/><RowDefinition/></Grid.RowDefinitions><Grid Grid.Row="0"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><Border Margin="5" Grid.Column="0" Background="#1b1c1d"/><Border Margin="5" Grid.Column="1" Background="#2AC864"/><Border Margin="5" Grid.Column="2" Background="#1b1c1d"/><Border Margin="5" Grid.Column="3" Background="#F85A54"/><Border Margin="5" Grid.Column="4" Background="#1b1c1d"/></Grid><Grid Grid.Row="1"><Grid.ColumnDefinitions><ColumnDefinition Width="1.5*"/><ColumnDefinition/></Grid.ColumnDefinitions><Border Margin="5" Grid.Column="0" Background="#1b1c1d"/><Border Margin="5" Grid.Column="1" Background="#2AC864"/></Grid><Grid Grid.Row="2"><Grid.ColumnDefinitions><ColumnDefinition Width="1.5*"/><ColumnDefinition/></Grid.ColumnDefinitions><Border Margin="5" Grid.Column="0" Background="#1b1c1d"/><Border Margin="5" Grid.Column="1" Background="#F85A54"/></Grid></Grid></Grid>
</Grid>

樣式基礎

樣式負責修飾元素的外觀以及行為,可以在樣式中定義不同類型元素的屬性值集合。

<Window.Resources><Style x:Key="BaseStyle" TargetType="Button"><Setter Property="FontSize" Value="18"/><Setter Property="Foreground" Value="White"/><Setter Property="Background" Value="Red"/></Style><Style x:Key="BottonStyle" TargetType="Button" BasedOn="{StaticResource BaseStyle}"><Setter Property="Content" Value="Botton1"/></Style>
</Window.Resources>
<Grid><StackPanel><Button Background="Blue" Style="{StaticResource BottonStyle}"/><Button Style="{StaticResource BottonStyle}"/><Button Style="{StaticResource BottonStyle}"/></StackPanel>
</Grid>

數據模板

<Grid><ListBox x:Name="list"><ListBoxItem><StackPanel Orientation="Horizontal"><Border Width="10" Height="10" Background="Red"/><TextBlock Margin="10,0"  Text="Red"/></StackPanel></ListBoxItem><ListBoxItem><StackPanel Orientation="Horizontal"><Border Width="10" Height="10" Background="Blue"/><TextBlock Margin="10,0"  Text="Red"/></StackPanel></ListBoxItem><ListBoxItem><StackPanel Orientation="Horizontal"><Border Width="10" Height="10" Background="Green"/><TextBlock Margin="10,0"  Text="Red"/></StackPanel></ListBoxItem></ListBox>
</Grid>

可以看到,這里每一項的構造都是完全相同的,唯一不同的就是它們的數據,因此可以將它抽離出來作為一個模板。

<Grid><ListBox x:Name="list"><ListBox.ItemTemplate><DataTemplate><StackPanel Orientation="Horizontal"><Border Width="10" Height="10" Background="{Binding Code}"/><TextBlock Margin="10,0"  Text="{Binding Name}"/></StackPanel></DataTemplate></ListBox.ItemTemplate></ListBox>
</Grid>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace WpfApp4 {/// <summary>/// MainWindow.xaml 的交互邏輯/// </summary>public partial class MainWindow : Window {public MainWindow() {InitializeComponent();List<Color> test = new List<Color>();test.Add(new Color() { Code = "#FFB6C1", Name = "淺粉紅" });test.Add(new Color() { Code = "#FFC0CB", Name = "粉紅" });test.Add(new Color() { Code = "#DC143C", Name = "猩紅" });test.Add(new Color() { Code = "#FFF0F5", Name = "臉紅的淡紫色" });//LightPink 淺粉紅	#FFB6C1	255,182,193//Pink 粉紅	#FFC0CB	255,192,203//Crimson 猩紅	#DC143C	220,20,60//LavenderBlush 臉紅的淡紫色	#FFF0F5	255,240,245list.ItemsSource = test;}public class Color {public string Code { get; set; }public string Name { get; set; }}}
}

由此就可以看到DataTemplate的作用。繼續編寫例子:

<Grid><DataGrid x:Name = "grid" AutoGenerateColumns="False" CanUserAddRows="False"><DataGrid.Columns><DataGridTextColumn Header="Code" Binding="{Binding Code}"/><DataGridTextColumn Header="Name" Binding="{Binding Name}"/><DataGridTemplateColumn Header="操作"><DataGridTemplateColumn.CellTemplate><DataTemplate><StackPanel Orientation="Horizontal"><Button Content="刪除" /><Button Content="復制" /><Button Content="保存" /></StackPanel></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid>
</Grid>

靈活地使用DataTemplate數據模塊,對后續開發有很重要的幫助,當然DataTemplate的應用不止于此,后續還會介紹到。

綁定

使用綁定可以使得控件與控件之間建立一種綁定關系,可以不再為此編寫大量的代碼來維持。

<Grid><StackPanel><Slider x:Name="slider" Margin="5" ValueChanged="Slider_ValueChanged"/><TextBox x:Name="textbox1" Margin="5" Height="30" TextChanged="textbox1_TextChanged"/><TextBox x:Name="textbox2" Margin="5" Height="30"/><TextBox x:Name="textbox3" Margin="5" Height="30"/></StackPanel>
</Grid>
namespace WpfApp5 {/// <summary>/// MainWindow.xaml 的交互邏輯/// </summary>public partial class MainWindow : Window {public MainWindow() {InitializeComponent();}private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) {textbox1.Text = slider.Value.ToString();textbox2.Text = slider.Value.ToString();textbox3.Text = slider.Value.ToString();}private void textbox1_TextChanged(object sender, TextChangedEventArgs e) {if (double.TryParse(textbox1.Text, out double result))slider.Value = result;}}       
}

此時代碼實現了拖動滑塊,下方三個框里的數據會同步變化。對下方任意一個框里的數據進行修改,上方滑塊的位置也會同步變化。為了實現這個功能,代碼變得特別的冗余,可以使用綁定來簡化。

<Grid><StackPanel><Slider x:Name="slider" Margin="5"/><TextBox Text="{Binding ElementName=slider,Path=Value}" x:Name="textbox1" Margin="5" Height="30"/><TextBox Text="{Binding ElementName=slider,Path=Value}" x:Name="textbox2" Margin="5" Height="30"/><TextBox Text="{Binding ElementName=slider,Path=Value}" x:Name="textbox3" Margin="5" Height="30"/></StackPanel>
</Grid>

此時就不需要具體的實現代碼了,使用綁定就可以完成兩個控件的雙向綁定。?

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

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

相關文章

開源大型語言模型的文本記憶新突破!

在現代科技的推動下&#xff0c;人工智能領域正在不斷地突破人類認知的極限。今年&#xff0c;由斯坦福大學、康奈爾大學和西弗吉尼亞大學的計算機科學家們&#xff0c;與法律學者共同展開了一項引人入勝的研究&#xff0c;聚焦于開源大型語言模型的文本記憶表現。這項研究不僅…

LeetCode 3090.每個字符最多出現兩次的最長子字符串

題目鏈接 https://leetcode.cn/problems/maximum-length-substring-with-two-occurrences/ 題目描述 給定一個字符串 s&#xff0c;找出滿足每個字符最多出現兩次的最長子字符串&#xff0c;并返回其長度。 示例 輸入&#xff1a;s "aabba" 輸出&#xff1a;5解…

使用開源NVIDIA cuOpt加速決策優化

使用開源NVIDIA cuOpt加速決策優化 文章目錄 使用開源NVIDIA cuOpt加速決策優化決策優化的現實挑戰供應鏈優化的復雜性實時決策的挑戰計算復雜性的挑戰 NVIDIA cuOpt&#xff1a;GPU加速的決策優化解決方案cuOpt的核心技術架構支持的優化問題類型性能優勢分析 實際應用案例&…

【JVM 09-垃圾回收】

垃圾回收 筆記記錄 1. 如何判斷對象可以回收1.1 引用計數法1.1.1 缺點 1.2 可達性分析算法1.2.1 可達分析、根對象1.2.2 優缺點 1.3 四種引用(強軟弱虛)1.3.1 軟引用的實際使用案例1.3.2 軟引用-引用隊列1.3.3 弱引用的實際使用案例 2. 垃圾回收算法2.1 標記清除算法2.2 標記整…

《二叉搜索樹》

引言&#xff1a; 上次我們結束了類和對象的收尾&#xff0c;之后我們就要學習一些高級的數據結構&#xff0c;今天我們先來看一個數據結構-- 二叉搜索樹。 一&#xff1a; 二叉搜索樹的概念(性質) 二叉搜索樹又稱二叉排序樹&#xff0c;它或者是一棵空樹&#xff0c;或者是…

【Redis】Sentinel哨兵

&#x1f6e1;? 深入理解 Redis Sentinel&#xff1a;高可用架構的守護者 在實際開發中&#xff0c;我們常用 Redis 構建緩存系統或數據中間件。然而&#xff0c;主從復制雖然能實現數據同步&#xff0c;但無法自動故障轉移&#xff08;failover&#xff09;&#xff0c;這就…

Shell腳本應用及實戰演練

文章目錄 一、Shell腳本語言的基本結構1、Shell腳本的用途&#xff1a;2、 Shell腳本基本結構&#xff1a;3、 創建Shell腳本過程4、 腳本注釋規范 二、Shell腳本語言的變量用法詳解位置與預定義變量 三、 Shell字符串詳解1、Shell字符串拼接2、Shell字符串截取3、 Shell的格式…

軟件工程瀑布模型學習指南

軟件工程瀑布模型學習指南 一、瀑布模型核心概念 1.1 定義與特點 瀑布模型是一種經典的軟件開發流程,將項目劃分為順序性的階段,每個階段有明確的輸入和輸出,如同瀑布流水般單向推進。其特點包括: 階段間具有明確的順序性和依賴性強調文檔驅動和階段評審適合需求明確、穩…

獲取gitlab上項目分支版本(二)

獲取gitlab上項目分支版本_gitlab代碼分支版本在哪-CSDN博客 原先寫過一版&#xff0c;但是這次想更新一下項目的分支信息時&#xff0c;提示我 git服務器上的Python版本是2.7.3&#xff0c;這個錯誤表明當前Python環境中沒有安裝requests庫&#xff0c;服務器也沒有連接外網&…

主流防火墻策略繞過漏洞的修復方案與加固實踐

主流防火墻策略繞過漏洞的修復方案與加固實踐 流量關鍵點分析&#xff08;攻擊手法&#xff09; 攻擊者通過精心構造的TCP序列號攻擊和惡意標志組合繞過防火墻DPI檢測&#xff0c;核心手法如下&#xff1a; TCP連接建立&#xff08;正常握手&#xff09; 1049&#xff1a;客戶…

泛微OAe9-后端二開常見數據庫操作

泛微OAe9-后端二開常見數據庫操作 文章目錄 泛微OAe9-后端二開常見數據庫操作一、RecordSet1 RecordSet 操作OA本身的表2 RecordSet 操作OA 本身的存儲過程 二、RecordSetTrans三、RecordSetDataSource四、原生 jdbc 一、RecordSet RecordSet 適用于操作 OA 自己的庫。OA 數據庫…

【數據分析八:hypothesis testing】假設檢驗

本節我們講述假設檢驗和抽樣方法 有關假設檢驗的詳細內容&#xff0c;可以參考我以往的博客 概率論與數理統計總復習_概率論與數理統計復習-CSDN博客文章瀏覽閱讀1.5k次&#xff0c;點贊33次&#xff0c;收藏23次。中科大使用的教輔《概率論和數理統計》&#xff0c;帶大家復…

AI免費工具:promptpilot、今天學點啥、中英文翻譯

promptpilot 激發模型潛能&#xff0c;輕松優化 Prompt https://promptpilot.volcengine.com/startup 今天學點啥 https://metaso.cn/study 能生成網頁和語音播報 中英文翻譯 沉浸式翻譯&#xff0c;瀏覽器插件&#xff0c;ai翻譯

計算機網絡學習筆記:TCP三報文握手、四報文揮手

文章目錄 前言一、TCP三報文握手二、TCP四報文揮手三、TCP保活計時器 前言 TCP通信&#xff0c;通常需要經歷三個階段&#xff1a;三報文握手->發送&#xff0c;接收數據->四報文揮手。 一、TCP三報文握手 三報文握手處于TCP的連接建立階段&#xff0c;主要解決了以下的…

kafka部署和基本操作

一、部署kafka 解壓 tar xzvf kafka_2.12-3.9.1.tgz tar -zxf kafka_2.12-3.9.1.tgz 1.修改config/server.properties # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # …

Bootstrap 5學習教程,從入門到精通,Bootstrap 5 導航語法知識點及案例代碼(17)

Bootstrap 5 導航語法知識點及案例代碼 Bootstrap 5 提供了強大的導航組件&#xff0c;幫助開發者快速構建響應式且美觀的導航欄。 一、Bootstrap 5 導航組件概述 Bootstrap 5 提供了多種導航組件&#xff0c;主要包括&#xff1a; 導航欄&#xff08;Navbar&#xff09;&am…

清除 docker 無用的 鏡像/容器

清除 docker 無用的 鏡像/容器 刪除 <none> 的 docker 鏡像 使用以下命令刪除所有 的 Docker 鏡像&#xff08;即懸空鏡像 / dangling images&#xff09;&#xff1a; docker image prune -f這會自動刪除所有沒有 tag 的鏡像&#xff08;&#xff09;&#xff0c;不會…

使用Charles抓包工具提升API調試與性能優化效率

在軟件開發過程中&#xff0c;網絡請求調試和性能優化往往成為開發者遇到的挑戰&#xff0c;尤其是在進行API接口調試時。開發者需要確保網絡請求的正確性、響應時間以及系統的整體性能。然而&#xff0c;傳統的調試方法常常無法提供足夠的細節來深入分析問題&#xff0c;進而影…

如何協調各項目關鍵節點的沖突與依賴

在多項目并行的環境下&#xff0c;關鍵節點間的沖突與依賴是導致項目延期、資源浪費和溝通誤解的主要根源。要高效協調此類問題&#xff0c;企業應重點從建立透明的進度依賴圖、使用項目管理工具對齊節點、推動跨部門協同機制入手。其中&#xff0c;通過Gantt圖或關鍵路徑法實現…

mongodb單節點改副本集模式

前一陣將三節點的副本集改成了單節點&#xff0c;但后面業務代碼出現問題&#xff1a;無法使用事務&#xff0c;因為事務只有在副本集上能用&#xff0c;單節點無法使用&#xff0c;故需要改回副本集模式&#xff0c;而我目前僅有一臺服務器&#xff0c;所以考慮在一臺服務器上…