WPF學習之繪圖和動畫

来源:http://www.cnblogs.com/lijuanfei/archive/2016/12/12/6166308.html
-Advertisement-
Play Games

如今的軟體市場,競爭已經進入白熱化階段,功能強、運算快、界面友好、Bug少、價格低都已經成為了必備條件。這還不算完,隨著電腦的多媒體功能越來越強,軟體的界面是否色彩亮麗、是否能通過動畫、3D等效果是否吸引用戶的眼球也已經成為衡量軟體的標準。 軟體項目成功的三個要素是:資源、成本、時間。無論是為了在 ...


如今的軟體市場,競爭已經進入白熱化階段,功能強、運算快、界面友好、Bug少、價格低都已經成為了必備條件。這還不算完,隨著電腦的多媒體功能越來越強,軟體的界面是否色彩亮麗、是否能通過動畫、3D等效果是否吸引用戶的眼球也已經成為衡量軟體的標準。

軟體項目成功的三個要素是:資源、成本、時間。無論是為了在競爭中保持不敗還是為了激發起用戶對軟體的興趣,提高軟體界面的美化程度、恰當的將動畫和3D等效果引入應用程式都是一個必然趨勢。然而使用傳統的桌面應用程式開發工具和框架(如Winform、MFC、VB、Delphi等)進行開發時,為了使軟體界面變漂亮、加入動畫或者3D效果,邊際成本會非常的高。體現在:

資源消耗增大:需要招聘懂得動畫和3D編程的程式員,還需要更多的設計師、工薪和溝通成本隨著上升。

開發時間增加:界面美化、動畫和3D開發遠遠比業務邏輯開發困難、耗時。

成本增加:隨著資源消耗的增加和開發周期的拉長,成本必然增加。

之所以會出現這種情況,根本原因在於傳統開發工具和框架並沒有原生的支持美化用戶界面、嚮應用程式中添加動畫和3D效果等功能。舉個簡單的例子,當用戶提出需要把TextBox的外觀改成圓角時,Winform和Delphi程式員只能通過派生新類併在底層做修改的方法來實現。類似的用戶需求還有好多不得不實現,否則客戶會懷疑我們的開發能力;即使實現了也沒有什麼額外的經濟效益,因為這些東西在客戶的眼裡都是很簡單的東西。

WPF的推出可謂是對症下藥、專門解決上述問題。體現在:

XAML語言針對的是界面美化的問題,可以讓設計師直接加入開發團隊、降低溝通成本。

XAML的圖形繪製功能非常強大,可以輕易繪出複雜的圖標、圖畫。

WPF支持濾鏡功能,可以像PhotoShop一樣為對象添加各種效果。

WPF原生支持動畫開發,無論是設計師還是程式員,都能夠使用XAML或C#輕鬆開發製作絢麗的動畫效果。

WPF原生支持3D效果,甚至可以將其它3D建模工具創建的模型導進來、為我所用。

Blend作為專門的設計工具讓WPF如虎添翼,即能夠幫助不瞭解編程的設計師快速上手,又能夠幫助資深開發者快速建立圖形或者動畫的原型。

1.1   WPF繪圖

與傳統的.net開發使用GDI+進行繪圖不同,WPF擁有自己的一套繪圖API。使用這套API不但可以輕鬆繪製出精美的圖形,還可以為各種圖形添加類似與PhotoShop的“濾鏡效果”及“變形效果”。本節我們就一起研究WPF圖形API繪圖,效果和變形等功能。

先觀察下麵一組圖片:

顯然,這組圖片是矢量圖(Vector Image),無論怎樣放大縮小都不會出現鋸齒。你可能會想:“這是組PNG格式的圖片嗎?”答案是“NO”。這組圖是用XAML語言繪製的!XAML繪圖本身就是矢量的,而且支持各式各樣的填充和效果,甚至還可以添加濾鏡,這些功能絲毫不亞於Photoshop。以前,使用PhotoShop製作出來的圖形需要程式員使用.net的繪圖介面進行二次轉換才能應用到程式里,現在好了,直接把XAML代碼拿來用就可以了。

繪圖並不是VisualStudio的強項,這些漂亮的XAML矢量圖是怎麼畫出來的呢?答案是藉助Microsoft Expression Studio中的Blend和Design兩個工具。Blend我們已經介紹過了,用它可以直接繪製XAML圖形;Design可以像PhotoShop或者FireWorks那樣繪製圖形,再由設計者決定導出xaml格式還是png格式。雖然“唯代碼派”的程式員們在Visualstudio里一行一行寫代碼也能把複雜的圖形以非可視化的形式創建出來,但在Blend和Design中畫出原型再在Visual Studio裡面進行細節的修飾才是提高效率之道。

積沙成塔,集腋成裘,別看前面那些圖片很複雜,但都是由幾個有限的基本圖形組成的。WPF的基本圖形包括以下幾個(它們都是Shap類的派生類):

Line:直線段,可以設置其筆觸(Stroke)。

Rectangle:矩形,既有筆觸,又有填充(Fill)。

Ellipse:橢圓,長寬相等的橢圓即為正圓,既有筆觸又有填充。

Polygon:多邊形,由多條直線線段圍成的閉合區域,既有筆觸又有填充。

PolyLine:折線(不閉合),由多條首尾相接的直線組成。

Path:路徑(閉合區域),基本圖形中功能最強的一個,可由若幹直線,圓弧,被塞爾曲線組成。

1   直線

直線是最簡單的圖形。使用X1,Y1兩個屬性值可以設置它的起點坐標,X2,Y2兩個屬性值可以設置它的終點坐標。控制終點/起點做標就可以實現平行,交錯等效果。Stroke(筆觸)屬性的數據類型是Brush(畫刷),凡是Brush的派生類均可以用於給這個屬性賦值。因為WPF提供多種漸變色畫刷,所以畫直線也可以畫出漸變效果。同時,Line的一些屬性還可以幫助我們畫出虛線以及控制線段終點的形狀。下麵的例子綜合了這些屬性:

 

[html] view plain copy  
  1. <Window x:Class="WpfApplication1.Window45"  
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  4.         Title="Window45" Height="293" Width="437">  
  5.     <Grid>  
  6.         <Line X1="10" Y1="20" X2="260" Y2="20" Stroke="Red" StrokeThickness="10"></Line>  
  7.         <Line X1="10" Y1="40" X2="260" Y2="40" Stroke="Orange" StrokeThickness="6"></Line>  
  8.         <Line X1="10" Y1="60" X2="260" Y2="60" Stroke="Green" StrokeThickness="3"></Line>  
  9.         <Line X1="10" Y1="80" X2="260" Y2="80" Stroke="Purple" StrokeThickness="2"></Line>  
  10.         <Line X1="10" Y1="100" X2="260" Y2="100" Stroke="Black" StrokeThickness="1"></Line>  
  11.         <Line X1="10" Y1="120" X2="260" Y2="120" StrokeDashArray="3" Stroke="Black" StrokeThickness="1"></Line>  
  12.         <Line X1="10" Y1="140" X2="260" Y2="140" StrokeDashArray="5" Stroke="Black" StrokeThickness="1"></Line>  
  13.         <Line X1="10" X2="260" Y1="160" Y2="160" Stroke="Black" StrokeThickness="6" StrokeEndLineCap="Flat"></Line>  
  14.         <Line X1="10" X2="260" Y1="180" Y2="180" Stroke="Black" StrokeThickness="8" StrokeEndLineCap="Triangle"></Line>  
  15.         <Line X1="10" X2="260" Y1="200" Y2="200" StrokeEndLineCap="Round" StrokeThickness="10">  
  16.             <Line.Stroke>  
  17.                 <LinearGradientBrush EndPoint="0,0.5" StartPoint="1,0.5">  
  18.                     <GradientStop Color="Blue"></GradientStop>  
  19.                     <GradientStop Offset="1" Color="Red"></GradientStop>  
  20.                 </LinearGradientBrush>  
  21.             </Line.Stroke>  
  22.         </Line>  
  23.     </Grid>  
  24. </Window>  
程式運行效果如下:

 

有一點需要特別註意,初學者認為繪圖一定要在Canvas中完成(誰叫它的名字叫畫布呢),其實不然,繪圖可以在任何一種佈局控制項中完成,WPF會自動根據容器的不同計算圖形的坐標,日常生活中,常用的繪圖容器有Canvas和Grid。

2      矩形

矩形有筆觸(Stroke,即邊線)和填充(Fill)構成。Stroke屬性的設置和Line一樣,Fill屬性的數據類型是Brush。Brush是一個抽象類,所以我們不可能拿一個Brush類的實例為Fill屬性賦值而只能用Brush派生類來進行賦值。WPF繪圖系統中包含非常豐富的Brush類型,常用的有:

SolidColorBrush:實心畫刷。在XAML中可以使用顏色名稱字元串直接賦值。

LinearGradientBrush:線性漸變畫刷。色彩沿設定的直線方向,按設定的變化點進行漸變。

RadialGradientBrush:徑向漸變畫刷。色彩沿半徑的方向、按設定的變化點進行漸變,形成圓形填充。

ImageBrsh:使用圖片作為填充類容。

DrawingBrush:使用矢量圖(Vector)和點陣圖(BitMap)作為填充內容。

VisualBrush:WPF中的每個控制項都是有FrameWrokElement派生而來的,而FrameWorkElment類又是由Visual類派生而來的。Visual意為“可視”之意,每個控制項的可視化形象就可以通過Visual類的方法獲得。獲得這個可視化形象之後,我們可以用這個形象進行填充,這就是VisualBrush。比如我想把窗體上的某個控制項拖到另外一個位置,當滑鼠鬆開之前需要在滑鼠指針下顯示一個幻影,這個幻影就是使用VisualBrush填充出來的一個矩形,並讓矩形捕捉滑鼠的位置、隨滑鼠移動。

下麵是使用不同畫刷填充矩形的綜合實例:

 

[html] view plain copy  
  1. <Window x:Class="WpfApplication1.Window46"  
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  4.         Title="Window46" Height="390" Width="600">  
  5.     <Grid>  
  6.         <Grid.ColumnDefinitions>  
  7.             <ColumnDefinition Width="180" />  
  8.             <ColumnDefinition Width="10" />  
  9.             <ColumnDefinition Width="180" />  
  10.             <ColumnDefinition Width="10" />  
  11.             <ColumnDefinition Width="180*" />  
  12.         </Grid.ColumnDefinitions>  
  13.         <Grid.RowDefinitions>  
  14.             <RowDefinition Height="160" />  
  15.             <RowDefinition Height="10" />  
  16.             <RowDefinition Height="160" />  
  17.         </Grid.RowDefinitions>  
  18.         <!--實心填充-->  
  19.         <Rectangle Grid.Row="0" Grid.Column="0" Stroke="Black" Fill="LightBlue"></Rectangle>  
  20.         <!--線性漸變-->  
  21.         <Rectangle Grid.Row="0" Grid.Column="2">  
  22.             <Rectangle.Fill>  
  23.                 <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">  
  24.                     <GradientStop Color="#FFB6F8F1" Offset="0"></GradientStop>  
  25.                     <GradientStop Color="#FF0082BD" Offset="0.25"></GradientStop>  
  26.                     <GradientStop Color="#FF95DEFF" Offset="0.6"></GradientStop>  
  27.                     <GradientStop Color="#FF004F72" Offset="1"></GradientStop>  
  28.                 </LinearGradientBrush>  
  29.             </Rectangle.Fill>  
  30.         </Rectangle>  
  31.         <!--徑向漸變-->  
  32.         <Rectangle Grid.Row="0" Grid.Column="4">  
  33.             <Rectangle.Fill>  
  34.                 <RadialGradientBrush>  
  35.                     <GradientStop Color="#FFB6F8F1" Offset="0"></GradientStop>  
  36.                     <GradientStop Color="#FF0082BD" Offset="0.25"></GradientStop>  
  37.                     <GradientStop Color="#FF95DEFF" Offset="0.75"></GradientStop>  
  38.                     <GradientStop Color="#FF004F72" Offset="1.5"></GradientStop>  
  39.                 </RadialGradientBrush>  
  40.             </Rectangle.Fill>  
  41.         </Rectangle>  
  42.         <!--圖片填充-->  
  43.         <Rectangle Grid.Row="2" Grid.Column="0">  
  44.             <Rectangle.Fill>  
  45.                 <ImageBrush ImageSource="./01077_1.png" Viewport="0,0,0.3,0.3" TileMode="Tile">  
  46.                       
  47.                 </ImageBrush>  
  48.             </Rectangle.Fill>  
  49.         </Rectangle>  
  50.         <Rectangle Grid.Row="2" Grid.Column="2">  
  51.             <Rectangle.Fill>  
  52.                 <DrawingBrush Viewport="0,0,0.2,0.2" TileMode="Tile">  
  53.                     <DrawingBrush.Drawing>  
  54.                         <GeometryDrawing Brush="LightBlue">  
  55.                             <GeometryDrawing.Geometry>  
  56.                                 <EllipseGeometry RadiusX="10" RadiusY="10"></EllipseGeometry>  
  57.                             </GeometryDrawing.Geometry>  
  58.                         </GeometryDrawing>  
  59.                     </DrawingBrush.Drawing>  
  60.                 </DrawingBrush>  
  61.             </Rectangle.Fill>  
  62.         </Rectangle>  
  63.         <!--無填充,使用線性漸變填充邊框-->  
  64.         <Rectangle Grid.Row="2" Grid.Column="5" StrokeThickness="10">  
  65.             <Rectangle.Stroke>  
  66.                 <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">  
  67.                     <GradientStop Color="White" Offset="0.3"></GradientStop>  
  68.                     <GradientStop Color="Blue" Offset="1"></GradientStop>  
  69.                 </LinearGradientBrush>  
  70.             </Rectangle.Stroke>  
  71.         </Rectangle>  
  72.     </Grid>  
  73. </Window>  

運行效果如下圖:

 

使用畫刷的時候,建議先在Blend裡面繪製圖大致的效果然後再在Visual Studio裡面微調。

接下來讓我們看一個VisualBrush的例子。為了簡單起見,目標控制項是一個Button,實際工作中換成複雜的控制項也一樣。程式的XAML代碼如下:

 

[html] view plain copy  
  1. <Window x:Class="WpfApplication1.Window47"  
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  4.         Title="Window47" Height="300" Width="400" Background="Orange">  
  5.     <Grid Margin="10">  
  6.         <Grid.ColumnDefinitions>  
  7.             <ColumnDefinition Width="160" />  
  8.             <ColumnDefinition Width="*" />  
  9.             <ColumnDefinition Width="160" />  
  10.         </Grid.ColumnDefinitions>  
  11.         <StackPanel Background="White" x:Name="spleft">  
  12.             <Button Height="40" Content="OK" x:Name="btnReal" Click="btnReal_Click"></Button>  
  13.         </StackPanel>  
  14.         <Button Grid.Column="1" Content=">>" Margin="5,0"></Button>  
  15.         <StackPanel Grid.Column="2" Background="White" x:Name="spRight">  
  16.               
  17.         </StackPanel>  
  18.     </Grid>  
  19. </Window>  

Button的事件處理器代碼如下:

 

 

[csharp] view plain copy  
  1. double o = 1;//不透明度指數  
  2. private void btnReal_Click(object sender, RoutedEventArgs e)  
  3. {  
  4.     VisualBrush vb = new VisualBrush(this.btnReal);  
  5.     Rectangle rtg = new Rectangle();  
  6.     rtg.Width = btnReal.Width;  
  7.     rtg.Height = btnReal.Height;  
  8.     rtg.Fill = vb;  
  9.     rtg.Opacity = o;  
  10.     o -= 0.2;  
  11.     this.spRight.Children.Add(rtg);  
  12. }  

運行效果如下圖:

 

3.       橢圓

橢圓也是一種常見的幾何圖形,它的使用方法和矩形沒有什麼區別。下麵的例子是繪製一個球體,球體的輪廓是正圓(Circle),Width和Height相等的橢圓即為正圓:球體的光影使用徑向漸變實現,XAML代碼如下:

 

[html] view plain copy  
  1. <Window x:Class="WpfApplication1.Window48"  
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  4.         Title="Window48" Height="300" Width="300">  
  5.     <Grid>  
  6.         <Ellipse Height="140"  Name="ellipse1" Stroke="Gray" Width="140" Cursor="Hand" ToolTip="A Ball">  
  7.             <Ellipse.Fill>  
  8.                 <RadialGradientBrush GradientOrigin="0.2,0.8" RadiusX="0.75" RadiusY="0.75">  
  9.                     <RadialGradientBrush.RelativeTransform>  
  10.                         <TransformGroup>  
  11.                             <RotateTransform Angle="90" CenterX="0.5" CenterY="0.5"></RotateTransform>  
  12.                         </TransformGroup>  
  13.                     </RadialGradientBrush.RelativeTransform>  
  14.                     <GradientStop Color="#FFFFFFFF" Offset="0" />  
  15.                     <GradientStop Color="#FF444444" Offset="0.66" />  
  16.                     <GradientStop Color="#FF999999" Offset="1" />  
  17.                 </RadialGradientBrush>  
  18.             </Ellipse.Fill>  
  19.         </Ellipse>  
  20.     </Grid>  
  21. </Window>  
運行效果如下圖:

 

與前面提到的一樣,橢圓的繪製和色彩填充在Blend裡面完成的,在VS裡面又做了一些相應的調整。

 

4      路徑

路徑(Path)可以說是WPF繪圖最強大的工具,一來是因為它完全可以替代其它幾種圖形,而來它可以將直線,圓弧,貝塞爾曲線等基本元素組合起來,形成更複雜的圖形。路徑最重要的一個屬性就是Data,Data的數據類型是Geometry(幾何圖形),我們正是使用這個屬性將一些基本的線段拼接起來,形成複雜的圖形。

為Data屬性賦值的方法有兩種:一種是標簽式的標準語法,另外一種是專門用於繪製幾何圖形的“路徑標記語法”。本小節我們使用標準標簽語法認識各種線段,下一節我們將學習繪製幾何圖形的路徑標記語法。

想要使用Path路徑繪製圖形,首先要知道幾何圖形數據是如何組合到Data屬性中的。Path的Data屬性是Geometry類,但是Geometry類是一個抽象類,所以我們不可能在XAML中直接使用<Geometry>標簽。

 

[html] view plain copy  
  1. <!--不可能出現-->  
  2. <Path>  
  3.     <Geometry>  
  4.         <!---->  
  5.     </Geometry>  
  6. </Path>  

我們可以使用Geometry的子類。Geometry的子類包括:

 

LineGeometry:直線幾何圖形。

RectangleGeometry:矩形幾何圖形。

EllipseGeometry:橢圓幾何圖形。

PathGeometry:路徑幾何圖形。

StreamGeometry:PathGeometry的輕量級替代品,不支持Binding、動畫等效果。

CombinedGeometry:由多個基本幾何圖形關聯在一起,形成的單一幾何圖形。

GeometryGroup:由多個基本幾何圖形組合在一起,形成的幾何圖形組。

可能讓大家比較迷惑的是:前面已經見過Line,Rectangle,Ellipse等類,怎麼現在又出來了LineGeometry、RectangleGeometry、EllipseGeometry類呢?它們的區別在於前面介紹的Line,Rectangle,Ellipse都是可以獨立存在的對象,而這些*Geometry類只能用於結合成其它幾何圖形、不能獨立存在-----當我們在Blend裡面選中一組獨立的幾何圖形併在菜單里執行組合路徑命令時,本質上就是把原來獨立的Line,Rectangle,Ellipse對象轉換成了*Geometry對象並結合成一個新的複雜幾何圖形。

回到Data的Path屬性,下麵這個例子簡要的展示了各種幾何圖形:

 

[html] view plain copy  
  1. <Window x:Class="WpfApplication1.Window49"  
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  4.         Title="Window49" Height="350" Width="340">  
  5.     <Grid>  
  6.         <Grid.RowDefinitions>  
  7.             <RowDefinition Height="160" />  
  8.             <RowDefinition Height="160" />  
  9.         </Grid.RowDefinitions>  
  10.         <Grid.ColumnDefinitions>  
  11.             <ColumnDefinition Width="160" />  
  12.             <ColumnDefinition Width="160" />  
  13.         </Grid.ColumnDefinitions>  
  14.         <!--直線-->  
  15.         <Path Stroke="Blue" StrokeThickness="2" Grid.Row="0" Grid.Column="0">  
  16.             <Path.Data>  <
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • redis里擁有一個靈活擴展且獲取表頭表尾複雜度為O(1)的雙端列表,分為list和listNode2部分組成。 list: listNode: 以下是雙向鏈表的實現原理: ...
  • yum(全稱為 Yellow dog Updater, Modified)是一個在Fedora和RedHat以及SUSE中的Shell前端軟體包管理器。基於RPM包管理,能夠從指定的伺服器自動下載RPM包並且安裝,可以自動處理依賴性關係,並且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載、安裝。yu ...
  • Devicetree(設備樹)是用來描述系統硬體信息的樹模型,其旨在unify內核。通過bootloader將devicetree的信息傳給kernel,然後kernel根據這些設備描述初始化相應的板級驅動,達到一個內核多個平臺共用的目的。 ...
  • 新組裝了個 64 位電腦,i5 CPU,進入 ubuntu 後,又是一通搜索設置,整理如下,以備後用。 安裝 .dep 包 sudo dpkg -i [filename.dep] 在 ubuntu 中訪問 windows 分區 sudo ntfsfix [/dev/sda1] 安裝 flash 插件 ...
  • 根據Linux設備模型可知,一個現實的Linux設備和驅動通常都需要掛接在一種匯流排上,對於本身依附於PCI、USB等的設備而言,這自然不是問題,但是在嵌入式系統裡面,SoC系統中集成的獨立的外設控制器、掛接在 SoC 記憶體空間的外設等卻不依附於此類匯流排。基於這一背景,Linux設計了一種虛擬的匯流排,... ...
  • .NET 簡介 .NET是 Microsoft XML Web services 平臺。是微軟用來實現XML,Web Services,SOA(面向服務的體繫結構service-oriented architecture)和敏捷性的技術。 技術人員一般將微軟看成一個平臺廠商。微軟搭建技術平臺,而技術 ...
  • 本篇博文結合問題背景,介紹了筆者曾經嘗試過的阻止按鈕重覆提交的三種不可行方案,並詳細介紹了一種可行方案。有需要的可以參考下,希望對大家有所幫助。 ...
  • 今天做一個管理後臺菜單,想著要用無限極分類,記得園子里還是什麼地方見過這種寫法,可今天找了半天也沒找到,沒辦法靜下心來自己寫了: 首先創建節點類(我給它取名:AdminUserTree): 為無限極分類填充數據,由於考慮到示來管理後臺每個頁面都會調用到,這裡我為控制器創建了一個基類方法 控制器(Co ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...