WPF 探究(一)

来源:https://www.cnblogs.com/ywjbokeyuan/archive/2020/06/07/12984005.html
-Advertisement-
Play Games

一、WPF介紹 WPF全稱 Windows Presentation Foundation,幹啥用的? 主要是用來製作Windows桌面客戶端軟體的。 .Net平臺下製作Windows桌面客戶端軟體主要有兩個,一個Winform,還有一個就是WPF了。 事件驅動時代:開發客戶端便採用Winform, ...


一、WPF介紹

WPF全稱 Windows Presentation Foundation,幹啥用的?
主要是用來製作Windows桌面客戶端軟體的。
.Net平臺下製作Windows桌面客戶端軟體主要有兩個,一個Winform,還有一個就是WPF了。

事件驅動時代:開發客戶端便採用Winform,可是界面邏輯跟業務邏輯交織在一起,其中的代碼隱藏類還包含了很多的事件,這樣的結果可想而知了,降低界面的渲染速度,而且代碼不太容易維護。
數據驅動時代:微軟便開發了專門針對數據的客戶端,WPF便因此產生。現在很多網站也是採用的數據驅動模式來開發的,比如國人尤大大開發的Vue,開發的時候只需註重數據,dom操作Vue會給你優雅的自動完成。

Winform優缺點:
優點:簡單,易控制,不是太占記憶體的
缺點:代碼耦合度高,不利於維護

WPF優缺點:
優點:支持MVVM模式,可以做出非常絢麗的界面,比如某60殺毒軟體,某雷下載軟體便是採用這個開發出來的。
缺點:占用的記憶體稍微高些,學習成本較高,需要理解數據綁定,事件綁定等較多概念。

二、XAML

幹啥用的?很簡單,就是專門用來做軟體界面的,類似於html語言,也是一種標記語言。
html中定義一個按鈕

1.<button>按鈕</button>  
2.<input type="button" value="按鈕" />

xaml中定義一個按鈕

1.<Button>按鈕</Button> 
2.<Button Content="按鈕" />  //將Button對象的屬性Content通過特性(Attribute)來賦值
3.<Button>按鈕</Button>
4.<Button>
      <Button.Content>按鈕</Button.Content>  //將屬性用作元素
  </Button> 

在這裡有必要說明一下:
屬性(Property)與特性(Attribute)是不同的。
屬性是針對面向對象的,一個對象有哪些屬性,比如車的顏色,輪胎等,便是所謂的屬性。
至於特性,那是專門針對標簽的。Property與Attribute並不完全映射的。大部分Attribute對應於 控制項對象 的Property 一個標簽,相當於在後臺聲明瞭一個對象 意思就是,在後臺聲明瞭一個Button對象。
也就是說,接下來的兩段代碼意思是一樣的。

//使用xaml語言編寫
<StackPanel>
      <Button Content="按鈕" />
</StackPanel>
//在後置代碼中編寫
Button button=new Button();
button.Content="按鈕";  //Content便是屬性,而在標簽中,則是特性(Attribute)
stackPanel.Children.Add(button);//在哪個位置添加按鈕  StackPanel標簽的Name名稱

名稱空間

其中第二行 xmlns聲明的是WPF核心名稱空間。它包含了所有WPF類,相比第三行,它沒有使用首碼,也就是整個文檔的預設名稱空間。
第三行 是XAML名稱空間。它包含了各種XAML特性。相比第二行,它使用了首碼x。也就是說,可以通過首碼x來使用該名稱空間。
x名稱空間裡面到底有什麼呢?
x名稱中主要含有標記擴展、特性跟XAML指令元素三大類。

名稱 作用
x:Class 指明代碼隱藏類,只能用於根節點
x:Key 常用在靜態資源,通過Key來指定具體的某個靜態資源
x:Name 跟標簽中的Name特性效果幾乎一樣
x:Code 在XAML中嵌入指令(幾乎不用)
... ...當然還有一些其他不常用到的,就不說了

在XAML中,我們可能會看到x:Name 跟Name,這兩者效果是一樣的,都是給相應的對象Name屬性賦值。
其中,倒數第三行,聲明瞭第三方的控制項名稱,也就是說,我可以通過<pu:Button></pu:Button>首碼來使用第三方的控制項。

你會發現,預設的名稱空間,感覺是個web中的URI,一開始,我也是這樣以為是引用web伺服器上的資源的。其實不然,微軟這麼做是因為schemas.com域就是他自己的,只有微軟會使用它。

代碼隱藏類(後置代碼)
在代碼聲明中,你會發現 x:Class="" 這個類便是代碼隱藏類,和界面是綁定在一起的,原理是通過C# partial關鍵字實現的。在這個代碼隱藏類里,我們可以寫該界面所對應的相關事件代碼,但這樣做容易導致界面代碼跟業務邏輯代碼耦合在一起(Winform便是如此),這並不是WPF設計的本意,WPF主要是根據MVVM思想來設計的,通過數據綁定、事件綁定來徹底分離前後端,前端只用xaml來寫,代碼隱藏類裡面幾乎不寫代碼,按鈕相關事件寫在ViewModel裡面,這樣做,高內聚低耦合,易維護易擴展。

三、佈局

WPF佈局模型也是一個重大改進。在WPF問世之前,佈局都是採用的坐標,就是位置是鎖死的,不會根據視窗的大小自動調整。WPF佈局採用的是類似Web中的流佈局,控制項可以自動的隨著視窗的大小自動調整。
1、StackPanel 類似web中的flex佈局
這個佈局容器非常簡單,就是水平(垂直)放置各個控制項。一維佈局容器。

<StackPanel Orientation="Vertical">
      <Button Content="按鈕1" />
      <Button Content="按鈕2" />
      <Button Content="按鈕3" />
      <StackPanel Orientation="Horizontal">
            <Button Content="按鈕111" />
            <Button Content="按鈕222" />
            <Button Content="按鈕333" />
      </StackPanel>
</StackPanel>

圖片:

2、Grid
這個佈局容器非常強大,二維佈局容器。
它可以指定一個類似表格的,可以任意的定義幾行幾列。然後相應的控制項可以指定放在這個容器的第幾行第幾列。

<Grid>
      <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
      </Grid.ColumnDefinitions>
      <Button Grid.Row="0" Grid.Column="0">按鈕1</Button>
      <Button Grid.Row="0" Grid.Column="1">按鈕2</Button>
      <Button Grid.Row="1" Grid.Column="0">按鈕3</Button>
      <Button Grid.Row="1" Grid.Column="1">按鈕4</Button>
</Grid>

備註:
其中,Button使用了Grid.Column,在Button類中是沒有這個屬性的,但它是從Grid容器附加的。Grid.Column便是附加屬性
圖片:

3、還有一些其他的佈局容器:WrapPanel、DockPanel、Canvas等,暫不介紹。
備註:
一般情況下,使用StackPannel跟Grid佈局就夠了,如果遇到複雜一點的情況下,佈局容器相互嵌套便可以解決。

四、元素和控制項

元素:不允許通過指定模板來定製外觀

說明
Border 圍繞單個控制項的邊框,可以指定Background、BorderBrush和BorderThickness
Viewbox 能夠拉伸和縮放子元素
TextBlock 用於顯示文本
RichTextBlock 顯示富文本
Image 顯示圖像,支持jpeg、png、bmp、svg,也支持gif動畫
... 還有一些其他的,暫不介紹

控制項:允許通過指定模板來定製外觀,這也是WPF的強大之處。
主要包含範圍控制項、內容控制項、按鈕、項控制項這幾個大類。

控制項 說明
TeetBox 用戶可輸入的文本
RichEditBox 允許輸入格式化的文本
PasswordBox 用於輸入密碼
DatePicker
CalendarDatePicker
CalendarView
用戶選擇日期
TimePicker 用戶輸入時間
ColorPicker 允許用戶選擇顏色
UserControl 可以重用的控制項
... 還有其他的,暫不介紹

五、WPF示例項目GitHub地址(待更新)

https://github.com/Harry-Jon/WPF_Study


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 聚合就是歸類的意思,把同類事物統一處理; 聚合根也就是最抽象,最普遍的特性; 背景 領域建模的過程回顧: 那麼問題來了? 為什麼要在限界上下文和實體之間增加聚合和聚合根的概念,即作用是什麼? 如何設計聚合? 按照一般的研究和學習思路,先弄懂概念,然後結合實際例子理解概念,然後再回答提出的問題。 聚合 ...
  • 1 第一單元 常用標準包(一) 2 3 1.學習目標 4 5 1. 掌握strings常用函數使用 6 2. 掌握strconv常用函數使用 7 3. 熟悉encoding常用函數使用 8 9 2.strings標準包 10 11 2.1 Contains 12 13 用途:字元串包含關係 14 1 ...
  • Auto.js是什麼 安卓腳本框架 可以做的事情 數據監控:可以監視當前手機的數據。 圖片監控:截圖獲取當前頁面信息。 控制項操作:模擬操作手機控制項。 自動化工作流:編寫簡單的腳本,完成一系列自動化操作。如:微信自動點贊,快速搶單等。 定時功能:定時執行某個腳本,來完成定時任務。如:定時打卡簽到等。 ...
  • 前言 在JAVA虛擬機記憶體管理中,堆、棧、方法區、常量池等概念經常被提到,對理論知識的理解也常常停留在字面意思上,比如說堆記憶體中存放對象,棧記憶體中存放局部變數,常量池中存放字元串常量表等,本篇文章通過一個有趣的例子,儘量將這些理論概念通過程式樣例及圖解的方式表達清楚,讓我們更能深入底層知識。 例子 ...
  • 前言 在ASP.NET Core中最大的更改之一是對Http請求管道的更改,在ASP.NET中我們瞭解HttpHandler和HttpModule但是到現在這些已經被替換為中間件那麼下麵我們來看一下他們的不同處。 HttpHandler Handlers處理基於擴展的特定請求,HttpHandler ...
  • 0. 前言 在上一篇,我們搭建了一個項目框架,基本上是一個完整的項目。目前而言,大部分的應用基本都是這個結構。好的,不廢話了,進入今天的議題:完成並實現數據層的基礎實現。 1. 數據實體 通常情況下,一個項目的數據實體中欄位並不是完全沒有規律可尋。通常情況下,必須有一個主鍵。有些時候,會要求在數據表 ...
  • 前言 在本章中,主要是藉機這個C#基礎篇的系列整理過去的學習筆記、歸納總結並更加理解透徹。 在.Net開發中,我們經常會遇到並使用過委托,如果能靈活的掌握並加以使用會使你在編程中游刃有餘,然後對於很多接觸C#時間不長的開發者而言,較好的理解委托和事件並不容易。 本節主要是講述對委托的定義、委托的使用 ...
  • 在打開頁面時報錯:無法使用前導 .. 在頂級目錄上退出 原因:頂級目錄不能使用../ 經過查找,發現站點地圖裡出問題了 把../去掉後正常 或者在地址前加~/(表示應用程式的根目錄) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...