WPF複習知識點記錄

来源:https://www.cnblogs.com/raok/archive/2023/07/02/17521172.html
-Advertisement-
Play Games

# WPF複習知識點記錄 由於近幾年主要在做Web項目,客戶端的項目主要是以維護為主,感覺對於基礎知識的掌握沒有那麼牢靠,趁著這個周末重新複習下WPF的相關知識。 文章內容主要來自大佬劉鐵錳老師的經典著作《深入淺出WPF》。 因為是複習,所以知識內容不會一一記錄,如有需要瞭解更多可以看書中內容。 * ...


WPF複習知識點記錄

由於近幾年主要在做Web項目,客戶端的項目主要是以維護為主,感覺對於基礎知識的掌握沒有那麼牢靠,趁著這個周末重新複習下WPF的相關知識。

文章內容主要來自大佬劉鐵錳老師的經典著作《深入淺出WPF》。

因為是複習,所以知識內容不會一一記錄,如有需要瞭解更多可以看書中內容。

註意:博客中的代碼示例我是以avalonia為UI框架寫的。代碼可能部分跟WPF的稍有不同。

1.從零起步認識XAML

1.什麼是XAML

XAML(讀作zaml)是WPF技術中專門用於設計UI 的語言

2.優點

  • 實現界面與代碼的分離
  • 可以設計出專業的UI和動畫
  • 基於XML的標記語言,簡單易懂,結構清晰

3.XAML剖析

1.最簡單的XAML代碼

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
</Window>

這個示例中,Window是一個XAML元素,它表示視窗組件。xmlns屬性定義了XML命名空間,即指明XAML所使用的命名空間。在這裡,http://schemas.microsoft.com/winfx/2006/xaml/presentation是WPF的命名空間。

這個示例中的XAML代碼只有一個Window元素,它是一個空的容器。可以在Window元素中添加其他界面元素,例如按鈕、文本框等,來構建應用程式的用戶界面。同樣,可以在XAML中設置屬性來更改元素的外觀和行為。

2.property和attribute

先不說WPF中兩個屬性的定義,我們先看看對應一個類的對象。

1)屬性是指類體里用get或set封裝好的屬性。屬性是面向對象的理論範疇。比如說一個盒子,盒子的高度,長度,都是這個盒子的屬性。在C#中實現的時候可以通過GET SET 封裝。

2)特性是指應用於類,欄位,方法,介面的進一步說明,用專業的術語就是給類,欄位,方法,介面補充元數據,說的再白一點就是給它們打上標記,打了標記後編譯器就知道如何來編譯它。特性是屬於編程語言層面的東西。比如2個相同的類,為了表示這2個類不完全相同或者有差異。這時候就要針對這兩個類加一些特性。

[Serializable]                                   // 這是Attribute,打上該標記的類說明可以被序列化
class Order
{
   protected internal Single Price { get; set; } // 這是Property

   [Obsolete("此方法已過時,請改用xxx.")]           // 打上該標記說明此方法是過時的
   public Single GetPrice()
   {
      return default(Single);
   }
}

在看在XAML中:

Attribute 在XAML中的對於標簽的屬性特征,以下都是Window標簽下的attribute

xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:AvaloniaMarkdown.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="AvaloniaMarkdown.Views.MainWindow"
x:DataType="vm:MainWindowViewModel"
xmlns:md="clr-namespace:Markdown.Avalonia;assembly=Markdown.Avalonia"
Icon="/Assets/avalonia-logo.ico"
Title="AvaloniaMarkdown"

Property 在後臺代碼中針對對象的屬性特征,對應的後端類的對象Text,就是一個 property:

private string _text="hello";
public string Text
{
    get => _text;
    set => this.RaiseAndSetIfChanged(ref _text, value);
}
private string _filePath;

3.xmlns 名稱空間

xmlns[:可選的映射首碼]="名稱空間"

用於引用外來程式集

xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:AvaloniaMarkdown.ViewModels"

沒有映射首碼的是預設名稱空間,預設名稱空間只能有一個。

通過xmlns,我們可以直接使用這些CLR名稱空間中的類型

4.partial關鍵字

XAML文件對應的.xaml.cs文件中的類的聲明使用了partial關鍵字,可以把一個類拆分在多處定義,只要各部分代碼不衝突即可,由於partial機制,我們實現邏輯代碼留在.cs文件中,把UI元素相關代碼分離出去。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

}

2.XAML語法

1.樹形結構

<Window>
	<Grid>
		<Grid.ColumnDefinitions>
			<ColumnDefinition Width="10*"/>
			<ColumnDefinition Width="10*"/>
		</Grid.ColumnDefinitions>
		<Grid.RowDefinitions>
			<RowDefinition Height="1*"/>
			<RowDefinition Height="10*"/>
		</Grid.RowDefinitions>
		<Grid Grid.Row="0"
            Grid.Column="0" Grid.ColumnSpan="2">
			<Grid.ColumnDefinitions>
				<ColumnDefinition Width="1*"/>
				<ColumnDefinition Width="9*"/>
			</Grid.ColumnDefinitions>
			<StackPanel Grid.Column="0" >
				<Button>打開</Button>
				<Button>保存</Button>
				<Label/>
			</StackPanel>
		</Grid>
		<TextBox Grid.Row="1" Grid.Column="0"/>
		<md:MarkdownScrollViewer Grid.Row="1"
            Grid.Column="1"/>
	</Grid>  
</Window>

XAML UI 框架是樹狀結構,以對象為根節點,一層一層往下包含。我們經常需要在這棵樹上進行按名稱查找元素、獲取父子節點等操作。WPF使用VisualTreeHelper、LogicalTreeHelper來操作樹。

2.x:Name

x:Name的作用:

  1. 告訴XAML編譯器,帶有x:Name的標簽需要聲明一個引用變數,變數名就是x:Name的值
  2. 將XAML標簽對應的對象的Name屬性也設為x:Name的值,並註冊到UI樹上,方便查找

2.x:Key

在資源字典(Resource Dictionary)中使用,構成其中的元素。資源(Resource )非常重要,存放需要重覆使用的內容。

	<Application.Resources>
		<Color x:Key="SystemAccentColor">rgb(155, 138, 255)</Color>
		<Color x:Key="SystemAccentColorDark1">rgb(155, 138, 255)</Color>
		<Color x:Key="SystemAltMediumLowColor">rgb(52, 53, 65)</Color>
		<Color x:Key="ApplicationPageBackgroundThemeBrush">rgb(52, 53, 65)</Color>
		<Color x:Key="ControlStrokeColorDefaultBrush">rgb(94, 95, 109)</Color>
	</Application.Resources>

3.控制項

1.ContentControl 單一內容控制項

只能單一元素充當其內容。

例如:Button、Label等(具體看書中列表)

2.HeaderdContentControl

除了用於顯示主體內容的區域外,控制項還具有一個顯示標題(header)的區域

例如:GroupBox、TabItem

3.ItemsControl

  • 顯示列表化的數據
  • 內容屬性為Items或ItemsSource
  • 每種ItemsControl都對應有自己的條目容器(Item Container)

例如:ListBox、TreeView

4.Decorator

在UI 上起裝飾效果,比如可以使用Border元素為一些組織在一起的內容加個邊框

例如:Border、ViewBox

5.TextBlock和TextBox

最常用的文本控制項

  • TextBlock 用於顯示文本,不能編輯
  • TextBox 允許編輯內容

6.Shape

繪製圖形使用的元素

  • Fill 屬性設置填充
  • Stroke 屬性設置邊線

7.Panel

所有的UI佈局元素都屬於這一族

Panel元素控制佈局

包括:Canvas、Grid、StackPanel等

4.佈局

WPF的UI形成的樹形結構,我們稱之為可視化樹(Visual Tree)

控制項框架形成的樹形結構,我們稱之為邏輯樹(Logic Tree)

五種大類

  • Grid 網格面板
  • DockPanel 停靠面板
  • StackPanel 棧面板
  • WrapPanel 環繞面板
  • Canvas 精准定位

下麵複習下它們的使用方法:

1.Grid

網格形式佈局

1.CloumnDefinitions

定義多少列

2.RowDefinitions

定義了多少行

	<Grid>
		<Grid.ColumnDefinitions>
			<ColumnDefinition Width="10*"/>
			<ColumnDefinition Width="10*"/>
		</Grid.ColumnDefinitions>
		<Grid.RowDefinitions>
			<RowDefinition Height="1*"/>
			<RowDefinition Height="10*"/>
		</Grid.RowDefinitions>
		<Grid Grid.Row="0"
            Grid.Column="0" Grid.ColumnSpan="2">
			<Grid.ColumnDefinitions>
				<ColumnDefinition Width="1*"/>
				<ColumnDefinition Width="9*"/>
			</Grid.ColumnDefinitions>
			<StackPanel Grid.Column="0" Orientation="Horizontal" HorizontalAlignment="Center">
				<Button Classes="small" Margin="0,0,20,0" Command="{Binding UploadCommand}">打開</Button>
				<Button Classes="small" Margin="0,0,20,0" Command="{Binding SaveCommand}">保存</Button>
				<Label Content="{Binding FilePath}" Margin="0,0,20,0"/>
			</StackPanel>
	</Grid>

3.Grid長寬常用設置值

  • 絕對值:double 數值後加單位尾碼
  • 比例值:double數值後加一個星號(*)(如上例)
  • 自動值:Auto

2.StackPanel

StackPanel可以把內部的元素在縱向或橫向上緊湊排列,形成棧式佈局

適合場合:

  • 同類元素需要緊湊排列(列表或菜單)
  • 移除其中的元素後能夠自動補缺的佈局或者動畫

1.屬性

常用屬性 數據類型 可選值 說明
Orientation Orientation Horizontal(水平排列)\Vertical(垂直排列) 決定內部元素是水平還是垂直排列,預設值(Vertical)
Background Brush 背景色(Red/Yellow等等)
HorizontalAlignment HorizontalAlignment Center(中心)/Left(靠左)/Right(靠右)/Stretch(拉伸以填充父元素) 決定內部元素在水平方向的對齊方式
VerticalAlignment VerticalAlignment Top(上方)/Center(中心)/Bottom(下方)/Stretch(拉伸以填充父元素) 決定內部元素在垂直方向的對齊方式

3.Canvas

畫布,可以使用Left、Top、Right、 Bottom。內部元素通過離上下左右的距離控制元素在佈局中的位置。

4.DockPanel

DockPanel會對每個子元素進行排序,並停靠在面板的一側,多個停靠在同側的元素則按順序排序,。

<Grid>
    <DockPanel Width="Auto" Height="Auto">
        <Button DockPanel.Dock="Left" >1</Button>
        <Button DockPanel.Dock="Top">2</Button>
        <Button DockPanel.Dock="Right">3</Button>
        <Button DockPanel.Dock="Bottom">4</Button>
    </DockPanel>
</Grid>

5.WrapPanel

流式佈局,根據Orientation屬性來設置其水平或垂直佈局方向

預設是水平排列

<WrapPanel>
    <Button />
    <Button />
    <Button />
    <Button />
    <Button />
    <Button />
</WrapPanel>

垂直排列

<WrapPanel Orientation="Vertical">
</WrapPanel>

5.Binding 綁定

數據交互核心屬性,在欄位定義的set語句中使用一個PropertyChanged事件,,當為Binding設置了數據源後,就會自動偵聽PropertyChanged事件

WPF

using CommunityToolkit.Mvvm
    
private string _searchKeyword;
public string SearchKeyword
{
    get => _searchKeyword;
    set => SetProperty(ref _searchKeyword, value);
}

Avalonia

using ReactiveUI;

private string _filePath;

public string FilePath 
{ 
    get => _filePath;
    set => this.RaiseAndSetIfChanged(ref _filePath, value);
}

6.Dependency Property 依賴屬性

依賴屬性是一種本身沒有可以沒有值,能通過使用Binding從數據源獲取值的屬性。擁有依賴屬性的對象稱為“依賴對象”

特點包括:

  • 節省實例對記憶體的開銷
  • 屬性值可以通過Binding依賴在其他的對象上

7.Attached Property 附加屬性

附加屬性,被環境賦予的屬性,作用是將屬性與數據類型(宿主)解耦,讓數據類型的設計更加靈活

	<Grid>
		<Grid.ColumnDefinitions>
			<ColumnDefinition Width="10*"/>
			<ColumnDefinition Width="10*"/>
		</Grid.ColumnDefinitions>
		<Grid.RowDefinitions>
			<RowDefinition Height="1*"/>
			<RowDefinition Height="10*"/>
		</Grid.RowDefinitions>
		<Grid Grid.Row="0"
            Grid.Column="0" Grid.ColumnSpan="2">
			<Grid.ColumnDefinitions>
				<ColumnDefinition Width="1*"/>
				<ColumnDefinition Width="9*"/>
			</Grid.ColumnDefinitions>
			<StackPanel Grid.Column="0" >
				<Button>打開</Button>
				<Button>保存</Button>
				<Label/>
			</StackPanel>
		</Grid>
		<TextBox Grid.Row="1" Grid.Column="0"/>
		<md:MarkdownScrollViewer Grid.Row="1"
            Grid.Column="1"/>
	</Grid> 

上面 TextBox 的Grid.Row,Grid.Column都是附加屬性。

8.Route 和Event 路由事件

路由事件被激發後是沿著Visual Tree傳遞的,只有這樣,“藏”在Templete里的控制項才能把消息送出來。

9.Resource 資源

每個WPF的界面的元素都具有一個名為Resources的屬性,這個屬性繼承自FrameWorkElement類,其類型為ResourceDictionary,用來存儲資源。

	<Application.Resources>
		<ResourceDictionary>
			<ResourceDictionary.MergedDictionaries>
				<ResourceInclude Source="/Assets/Lang/en-US.axaml" />
			</ResourceDictionary.MergedDictionaries>
		</ResourceDictionary>

	</Application.Resources>

在使用資源時候分為靜態資源(StaticResource)和動態資源(DynamicResource)

1.StaticResource

在程式載入記憶體時對資源一次性使用,之後就不再去訪問這個資源了

 <TextBox Grid.Row="4"
			   Name="Editor3"
			   AcceptsReturn="True"
			   Text="{Binding Source={StaticResource VMLocator}, Path=EditorViewModel.Editor3Text,Mode=TwoWay}"
			   FontSize="{Binding Source={StaticResource VMLocator}, Path=EditorViewModel.EditorCommonFontSize}" />

2.StaticResource

程式運行過程中仍然會去訪問資源

<Rectangle Name="PART_BottomRightCorner"
									   Fill="{DynamicResource DataGridScrollBarsSeparatorBackground}"
									   Grid.Column="2"
									   Grid.Row="2" />

10.Template 模板

1.ControlTemplate 控制器模板

<ControlTemplate>
					<Border Name="DataGridBorder"
							Background="{TemplateBinding Background}"
							BorderBrush="{TemplateBinding BorderBrush}"
							BorderThickness="{TemplateBinding BorderThickness}"
							CornerRadius="{TemplateBinding CornerRadius}">
						<Grid ColumnDefinitions="Auto,*,Auto" RowDefinitions="Auto,*,Auto,Auto">
							<DataGridColumnHeader Name="PART_TopLeftCornerHeader"
												  Theme="{StaticResource DataGridTopLeftColumnHeader}" />
							<DataGridColumnHeadersPresenter Name="PART_ColumnHeadersPresenter"
															Grid.Column="1"
															Grid.Row="0" Grid.ColumnSpan="2" />
							<Rectangle Name="PART_ColumnHeadersAndRowsSeparator"
									   Grid.Row="0" Grid.ColumnSpan="3" Grid.Column="0"
									   VerticalAlignment="Bottom"
									   Height="1"
									   Fill="{DynamicResource DataGridGridLinesBrush}" />

							<DataGridRowsPresenter Name="PART_RowsPresenter"
												   Grid.Row="1"
												   Grid.RowSpan="2"
												   Grid.ColumnSpan="3" Grid.Column="0">
								<DataGridRowsPresenter.GestureRecognizers>
									<ScrollGestureRecognizer CanHorizontallyScroll="True" CanVerticallyScroll="True" />
								</DataGridRowsPresenter.GestureRecognizers>
							</DataGridRowsPresenter>
							<Rectangle Name="PART_BottomRightCorner"
									   Fill="{DynamicResource DataGridScrollBarsSeparatorBackground}"
									   Grid.Column="2"
									   Grid.Row="2" />
							<Image Source="/Assets/maskGrad.png"
								   Grid.Row="1" Grid.RowSpan="2" Grid.Column="0" Grid.ColumnSpan="4"
								   VerticalAlignment="Stretch"
								   HorizontalAlignment="Right"
								   Width="60"
								   Stretch="Fill"
								   IsHitTestVisible="False"
								   ZIndex="1" />
							<ScrollBar Name="PART_VerticalScrollbar"
									   Orientation="Vertical"
									   Grid.Column="2"
									   Grid.Row="1"
									   Width="{DynamicResource ScrollBarSize}"
									   ZIndex="2" />
							
							<Grid Grid.Column="1"
								  Grid.Row="2"
								  ColumnDefinitions="Auto,*">
								<Rectangle Name="PART_FrozenColumnScrollBarSpacer" />
								<ScrollBar Name="PART_HorizontalScrollbar"
										   Grid.Column="1"
										   Orientation="Horizontal"
										   Height="{DynamicResource ScrollBarSize}" />
							</Grid>
							<Border Name="PART_DisabledVisualElement"
									Grid.ColumnSpan="3" Grid.Column="0"
									Grid.Row="0" Grid.RowSpan="4"
									IsHitTestVisible="False"
									HorizontalAlignment="Stretch"
									VerticalAlignment="Stretch"
									CornerRadius="2"
									Background="{DynamicResource DataGridDisabledVisualElementBackground}"
									IsVisible="{Binding !$parent[DataGrid].IsEnabled}" />
						</Grid>
					</Border>
				</ControlTemplate>

2.DataTemplate 數據模板

<DataTemplate>
    <TextBlock Text="{Binding Title}" />
</DataTemplate>

11.Style 風格

設計外觀和行為動作

1.Setter 設置器

Setter 類的Property屬性用來指明你想為目標的哪個屬性賦值,Value屬性則是你提供的屬性值

<Style Selector="Grid Button">
    <Setter Property="BorderBrush" Value="rgb(94, 95, 109)" />
    <Setter Property="BorderThickness" Value="1" />
    <Setter Property="FontSize" Value="16" />
    <Setter Property="Padding" Value="10,0,10,2" />
    <Setter Property="Height" Value="32" />
    <Setter Property="CornerRadius" Value="6" />
    <Setter Property="Margin" Value="0" />
    <Setter Property="FontFamily" Value="avares://TmCGPTD/Assets/Lato-Regular.ttf#Lato" />
    <Setter Property="Transitions">
        <Transitions>
            <BrushTransition Property="Background" Duration="0:0:0.2" />
        </Transitions>
    </Setter>
</Style>

上面的例子是針對 Grid ButtonStyle,使用了若幹個Setter 來設置 Grid 中的Button的一些屬性,這樣,在程式中, Grid 中的Button就會具有統一的風格。

2.Trigger 觸發器

當條件滿足時會觸發一個行為。

<Grid>
    <TextBlock Text="raokun" Width="75" Height="20">
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Foreground" Value="blue" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
</Grid>

上面的例子,是當滑鼠移動在上面時,字體的顏色變成藍色。

閱讀如遇樣式問題,請前往個人博客瀏覽: https://www.raokun.top
擁抱ChatGPT:https://ai.terramours.site
開源項目地址:https://github.com/firstsaofan/TerraMours

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

-Advertisement-
Play Games
更多相關文章
  • # 數列分段 Section II ## 題目描述 對於給定的一個長度為N的正整數數列 $A_{1\sim N}$,現要將其分成 $M$($M\leq N$)段,並要求每段連續,且每段和的最大值最小。 關於最大值最小: 例如一數列 $4\ 2\ 4\ 5\ 1$ 要分成 $3$ 段。 將其如下分段: ...
  • 本文通過閱讀Spring源碼,分析Bean實例化流程。 # Bean實例化入口 上一篇文章已經介紹,Bean實例化入口在AbstractApplicationContext類的finishBeanFactoryInitialization方法: ```java protected void fini ...
  • # 1、Java常用插件實現方案 ## 1.2、serviceloader方式 serviceloader是java提供的spi模式的實現。按照介面開發實現類,而後配置,java通過ServiceLoader來實現統一介面不同實現的依次調用。而java中最經典的serviceloader的使用就是J ...
  • **原文鏈接:** [Go 語言 context 都能做什麼?](https://mp.weixin.qq.com/s/7IliODEUt3JpEuzL8K_sOg) 很多 Go 項目的源碼,在讀的過程中會發現一個很常見的參數 `ctx`,而且基本都是作為函數的第一個參數。 為什麼要這麼寫呢?這個參 ...
  • POM( Project Object Model,項目對象模型 ) 是 Maven 工程的基本工作單元,它是一個 XML 文件,包含了項目的基本信息,用於描述項目如何構建,聲明項目依賴等等。執行任務或目標時,Maven 會在當前目錄中查找並讀取 POM,獲取所需的配置信息,然後執行目標。 1、基本 ...
  • # HttpServletResponse對象 ## 基本介紹 ​ Web伺服器收到客戶端的http請求,會針對每次請求,分別創建一個用於**代表請求**的 request對象 和**代表響應**的 response對象。 ​ request 和 response對象 代表請求和響應:**獲取客戶瑞 ...
  • 不知不覺,《C++面試八股文》已經更新30篇了,這是我第一次寫技術博客,由於個人能力有限,出現了不少紕漏,在此向各位讀者小伙伴們致歉。 為了不誤導更多的小伙伴,以後會不定期的出勘誤文章,請各位小伙伴留意。 在《[C++面試八股文:C++中,設計一個類要註意哪些東西?](https://zhuanla ...
  • ### 1、背景介紹 前兩天,現場的同事使用開發的程式測試時,發現日誌中報`etcdserver: mvcc: database space exceeded`,導致 etcd 無法連接。很奇怪,我們開發的程式只用到了 etcd 做程式的主備,並沒有往 etcd 中寫入大量的數據,為什麼會造成 et ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...