1. 程式人生 > >WPF學習筆記(一)

WPF學習筆記(一)

# 引言 在桌面開發領域,雖然在某些領域,基於electron的跨平臺方案能夠為我們帶來某些便利,但是由於WPF技術能夠更好的運用Direct3D帶來的效能提升、以及海量Windows作業系統和硬體資源的支援,所以他依然有著得天獨厚的優勢。 當然,選用一門技術,依然看公司的基因土壤和綜合因素或者老闆的心血來潮,例如QT也同樣是一門非常不錯的跨平臺圖形介面解決方案。 目前我們公司在桌面開發領域廣泛應用了WPF技術,主要是使用其作為大屏資料視覺化相關的UI呈現,包括一些資料展示效果、動畫效果等。由於之前我對WPF僅有三週經驗,因此在開發和設計相關功能時,一些簡單功能還能勉強完成,稍微複雜一點的就有點費時過長了,因此這篇文章主要梳理自己的學習筆記,以便總結學習成果。 # 如何學習WPF技術? 在Quote上有人提出了這樣一個相同的問題,[檢視問題](https://www.quora.com/How-can-I-learn-WPF-easily),開發者Srikanth Pagadala如是回答: >1、以瞭解基礎控制元件作為學習的起步過程:這些控制元件包括TextBox,Button,TextBlock及其他的,理解這些控制元件對外提供的屬性,以及如何使用。 >2、瞭解和使用佈局空間:例如Grid、StackPanel、DockerPanel和其他控制元件,在這一點上,你需要花費大量的時間。同時你需要學會建立複雜的UI設計。 >3、瞭解迴圈型別的空間,例如ItemControl控制元件。 >4、瞭解關於模板的概念。包括如何定義包含CheckBox的Combox,同時這個控制元件還包含了一張圖片的按鈕,以及如何在ItemsControl中使用不同的模板。 >5、理解資料繫結的執行機制。嘗試建立一個MVVM或類似型別的應用程式。 >6、建立一個典型的控制元件,探索DependencyProperties(依賴屬性)和AttachedProperties(附加屬性)。 >7、建立一個樣式資源,理解如何給控制元件設計樣式。 除此之外,還有其他開發者給出了補充回答: >1、學習控制元件的資料繫結過程,在DataGrid上實現資料繫結。 >2、學習和實現INotifyPropertyChanged類。[檢視如何實現](https://msdn.microsoft.com/en-us/library/vstudio/ms743695(v=vs.100).aspx) >3、學習Observable Collection。該型別的集合廣泛使用於資料集合繫結方面,同時也提供了資料改變通知的機制。 >4、使網格上的列可編輯。用文字控制元件(使用者專案模板)替換列。為每個捕獲文字更改事件的列建立一個屬性。在文字控制元件上使用繫結型別。嘗試捕獲您在後端在網格上所做的更改。 >5、成功將資料控制元件中的文字控制元件與後端屬性繫結後,請在同一頁面上建立網格的副本。嘗試同步這兩個網格。例如,您在第一個網格中所做的每個更改都必須在第二個網格中自動更新。 網站“[https://www.wpf-tutorial.com/](https://www.wpf-tutorial.com/)”是一個專門用於學習WPF的網站,通過這個網站,可以快速的入門WPF。 由於WPF技術已經比較熟悉,所以書籍也比較多,網友推薦來自劉鐵猛老師的《深入淺出WPF》這本書,而我通過Kindle則看到了一本比較有意思的書《葵花寶典-WPF自學手冊》,這本書寫得比較生動,通過故事的形式講了WPF的許多技術原理,無形中讓我對WPF的概念有了許多新的認識。當然,這本書已經有點年頭了。 # WPF的常用控制元件 | 控制元件型別 | 控制元件名稱 | 控制元件說明 | 連結地址 | |:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:| | 元件 | Window | 視窗 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.window?view=netframework-4.8) | | | Page | 頁面 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.controls.page?view=netframework-4.8) | | | NavigationWindow | 導航視窗 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.navigation.navigationwindow?view=netframework-4.8) | | | Frame | | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/Frame) | | 常規控制元件 | Button | 按鈕控制元件,提供Content作為內容 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/Button) | | | TextBox | 文字框控制元件,用以輸入文字 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/TextBox) | | | TextBlock | 文字塊,用以顯示文字 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/TextBlock) | | | Label | 標籤,用以顯示文字 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/Label) | | | ProgressBar | 進度條 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/ProgressBar) | | | ToggleButton | 一種可以設定開關三態的按鈕 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.controls.primitives.togglebutton?view=netframework-4.8) | | | Image | 影象控制元件,通過Source設定資源路徑 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/Image) | | | CheckBox | 勾選框,可以設定是否勾選的三種狀態 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/CheckBox) | | | RichTextBox | 富文字框,可以多種格式顯示和輸入文字 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/RichTextBox) | | | TreeView | 樹檢視,以樹狀圖的形式顯示繫結內容,可以顯示是否勾選三態。 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/TreeView) | | | WebBrowser | 瀏覽器,基於IE核心的瀏覽器控制元件 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.controls.webbrowser?view=netframework-4.8) | | | Calendar | 日曆控制元件 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.controls.calendar?view=netframework-4.8) | | | ComboBox | 下拉列表 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/ComboBox) | | | ContentControl | 內容控制元件 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.controls.contentcontrol?view=netframework-4.8) | | | Expander | 擴充套件器,可以顯示和摺疊面板內的元素 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/Expander) | | | GroupBox | 分組框 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/GroupBox) | | | StatusBar | 狀態列,用於在頁面下方顯示狀態資訊。 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/StatusBar) | | | DateTimePicker | 時間控制元件,可以設定時間狀態。 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.forms.datetimepicker?view=netframework-4.8) | | | DocumentViewer | 文件檢視器 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/DocumentViewer) | | | RadioButton | 單選按鈕 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/RadioButton) | | | ScollViewer | 滾動檢視 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/scrollviewer-overview) | | | ScollBar | 滾動條 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.controls.primitives.scrollbar?view=netframework-4.8) | | | Separator | 分隔器 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/Separator) | | | ToolBar | 工具條 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/ToolBar) | | | Slider | | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/Slider) | | | Menu | 選單 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/Menu) | | | MediaElement | 多媒體控制元件 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.controls.mediaelement?view=netframework-4.8) | | | PasswordBox | 密碼輸入框 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/PasswordBox) | | | TabControl | 選項卡 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/TabControl) | | | ToolBarTray | 工具條 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.controls.toolbartray?view=netframework-4.8) | | | WindowsFormsHost | 用以承載WinForm | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.forms.integration.windowsformshost?view=netframework-4.8) | | | Border | 邊框 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/Border) | | 資料控制元件 | ListView | 列表檢視 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/ListView) | | | DataGrid | 資料表 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/datagrid) | | | ListBox | 列表框 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/ListBox) | | 佈局 | WrapPanel | 可變面板 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/WrapPanel) | | | StackPanel | 固定面板 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/StackPanel) | | | DockerPanel | 停靠面板 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.controls.dockpanel?view=netframework-4.8) | | | Grid | 表格佈局 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/Grid) | | | UniformGrid | 統一分佈表格佈局 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.controls.primitives.uniformgrid?view=netframework-4.8) | | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/Label) | Canvas | 畫布 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/Canvas) | | 圖形 | Point | 點 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/Border) | | | Line | 線 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.shapes.line?view=netframework-4.8) | | | Path | 路徑 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.shapes.path?view=netframework-4.8) | | | Polygon | 多邊形 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.shapes.polygon?view=netframework-4.8) | | | Polyline | 多段線 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.shapes.polyline?view=netframework-4.8) | | | Rectangle | 矩形 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.drawing.rectangle?view=netframework-4.8) | | | Shape | 畫筆 | [檢視示例](http://各類圖元的基類) | | | Rectangle | 矩形 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.drawing.rectangle?view=netframework-4.8) | | | Ellipse | 橢圓 | [檢視示例](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.shapes.ellipse?view=netframework-4.8) | # WPF的XAML語法 ## 概述 在WPF技術中引入的XAML語法算是該技術的一大特色,也是被學習者視同為學習路徑陡峭的“罪魁禍首”。原因是在前端技術飛速發展的今天,HTML的語法體系由於更早的被開發者接受,所以也自然而然更容易成為開發者的首選。 而XAML是一種脫胎於XML,並吸收了HTML的精華的語法體系,是一種介面描述語言,XML語法本身相對而言較為臃腫的體系,看似成為了他的歷史負擔,但是其實倒也沒那麼複雜,通過幾個簡單的示例,其實就足夠掌握這門新的語法體系了。例如,使用
這樣的語法,完全可以平滑過渡到這樣的語法體系。(部分標籤其實只是大小寫不同)。當然,在XAML中熟練編寫樣式,確實需要花一點點時間。 在WPF中,通過XAML定義面向使用者互動層的介面,然後編譯成baml執行,後端則使用C#或VB.NET這樣的CLR語法來實現邏輯互動。 ## XAML的語法定義 ### XAML的根元素定義 根元素定義是定義XAML的名稱空間。 ``` ``` ### XAML的屬性語法 通過xaml定義按鈕,並設定文字為 helloworld 。這種寫法在官方文件中稱為“屬性語法”,即直接在XAML中對屬性進行設定。 ``` ``` ### XAML的集合語法 定義按鈕的顏色為紅色和藍色漸變色,內容為helloworld。這種稱為“集合語法”。 ``` ``` ## XAML的樣式定義 ### 通過屬性語法來定義按鈕的外觀 樣式定義使用 標籤,然後在中間對樣式的內容進行定義。 例如,以下表示通過XAML語法對 ToggleButton 按鈕定義了一個命名為 ToggleLikeButtonStyle 的樣式。 ```   ``` ### WPF中的模板Template WPF中的控制元件可以通過模板 Template 的形式來定義其內容,使得開發者能夠通過 XAML 靈活的對控制元件的外觀進行擴充套件。例如,如下定義了一個 Template,這個控制元件模板將會對控制元件(Button)定義填充制定顏色。 ```                                                                                                                                                              
                               
                           
                                                   
                   
               
           
``` ### XAML中的觸發器Triggers 傳統的WinForm開發者習慣於通過事件的機制對按鈕的外觀進行定義,而在WPF中,則可以通過屬性的形式對外觀進行設定,這使得開發者更能夠寫出高質量的程式碼。 例如,如下程式碼通過定義觸發器,設定控制元件(控制元件為 ToggleButton),當控制元件的勾選狀態屬性為“IsChecked” 時,其邊框填充色為#4696F2顏色。 ```                                                                                            ``` ### 部分完整程式碼 在上述事例中,共定義了兩個按鈕的樣式,分別是: * **FlatButtonStyle,這是個圓角按鈕。**![](https://img2020.cnblogs.com/blog/191302/202003/191302-20200318212756317-118994661.png) ``` ``` * **ToggleLikeButtonStyle,這是一個點贊按鈕。**![](https://img2020.cnblogs.com/blog/191302/202003/191302-20200318212810837-524413026.png) ``` ``` ## XAML的[標記擴充套件](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/advanced/markup-extensions-and-wpf-xaml) 通過了解WPF的常用控制元件,我們可以知道自己需要使用的控制元件有哪些屬性,並能使用 XAML 語法對相應的屬性進行設定,這種設定方法有別於通過C#程式碼的形式進行定義的方法,在 XAML中的屬性稱為 “標記”。標記使用 “{}” 花括號,編譯器通過該花括號將語法和XAML語法進行區分。 例如: ```  HeaderTemplate="{DynamicResource StretchedHeaderTemplate}" ``` ### 標記值的轉換與TypeConverters 在進行標記值轉換時,有時候需要使用TypeConverters實現型別轉換。例如,在上述示例程式碼中,可以看到使用了字串“#525252”來定義顏色,在內部就是實現了從字串到 Color 類的轉換過程。限於篇幅有限,此處就暫時略過。 ### XAML中內建特殊標記擴充套件 * x:Type:特定型別 ``` ``` * x:Static:使用靜態值。 ``` ``` * x:Null:使用空物件定義為屬性值。 ``` ``` * x:Array:使用陣列物件。 ``` arrayContents ``` ### 常見的標記擴充套件 1. StaticResource:通過替換已定義資源的值來為屬性提供內容,該資源標記在XAML載入時自動執行。靜態資源無法通過在XAML語法體系中對其引用關係進行前向引用,意味著無法通過多層級關係定義可複用的樣式資源,如果需要這樣做,則需要使用DynamicResource。 ``` ``` 2. DynamicResource:在執行時為資源提供內容。 ``` ``` 3. Binding:在執行時為使用資料上下文為資料提供內容。 ``` -or- -or- -or ``` 4. RelativeSource:提供了可在執行時物件樹中導航幾個可能的關係的 [Binding](https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.data.binding) 的源資訊。 ``` ``` 5. TemplateBinding:使控制元件模板能夠使用模板化屬性的值,這些屬性來自於將使用該模板的類的物件模型定義屬性。 ``` ``` 6. ColorConvertedBitmap:提供一種方法,用於指定沒有嵌入的配置檔案的點陣圖源。 顏色上下文/配置檔案由 URI 指定,與映像源 URI 相同。 ``` ``` 7. ComponentResourceKey和TemplateResourceKey: ``` ``` ## XAML資源複用 在開發過程中,我們可以直接在按鈕上進行按鈕模板的定義,例如下面的程式碼。 ```                           ``` 這樣的程式碼在介面比較簡單時,還無所謂,但是隨著控制元件的樣式越來越複雜,可能會成為一團亂麻,這對於追求優雅程式碼的我們來說,可能是難以忍受的,所以往往會使用資源引用來完成。 ### StaticResource 例如,我們可以在當前頁面程式碼中定義對應的樣式,這種樣式可以使用 StaticResource 的形式引入。但是這樣的引用形式,沒有物件圖的訪問許可權,意味著無法訪問資源依賴的其他資源。 ```  
WPF 學習筆記

故事 oid 控件 .sh enter 按鈕 初始 學習 mouse 最近看了些WPF相關的資料,覺得它開發桌面程序還是蠻快的,控件什麽基本不需用代碼實現。很多的調用有框架底層完成,如我有酒,你有故事這般的搭配。 (一)拖入控件以後,需要給控件起個好辨別的名稱

WPF學習筆記

# 引言 在桌面開發領域,雖然在某些領域,基於electron的跨平臺方案能夠為我們帶來某些便利,但是由於WPF技術能夠更好的運用Direct3D帶來的效能提升、以及海量Windows作業系統和硬體資源的支援,所以他依然有著得天獨厚的優勢。 當然,選用一門技術,依然看公司的基因土壤和綜合因素或者老闆

C# WPF 基礎教程 視訊學習筆記

1.[STAThread()] 代表單執行緒 2.using語句允許程式設計師指定使用資源的物件應當何時釋放資源 3.Border 一般用於裝載面板   Padding 邊框和內部內容中間新增空間   CornerRadius可以使邊框具有一個圓角     4.DockP

python框架之 Tornado 學習筆記

tornado pythontornado 一個簡單的服務器的例子:首先,我們需要安裝 tornado ,安裝比較簡單: pip install tornado 測試安裝是否成功,可以打開python 終端,輸入: import tornado.https

Scala學習筆記編程基礎

大數據 上一個 extends 移除 condition api arr 調用方法 tab 強烈推薦參考該課程:http://www.runoob.com/scala/scala-tutorial.html 1. Scala概述 1.1. 什麽是Scala Scala

3D Game Programming withDX11 學習筆記 數學知識總結

表示 圖形 http 根據 轉置 元素 material -s com   在圖形學中,數學是不可或缺的一部分,所以本書最開始的部分就是數學知識的復習。在圖形學中,最常用的是矢量和矩陣,所以我根據前面三個章節的數學知識,總結一下數學知識。 一、矢量   數學中的矢量,擁有

系統分析與設計學習筆記

學習 掌握 應該 溝通 基本 最終 表示 對象 毫無 為什麽要學習這門課程?   “擁有一把錘子未必能成為建築師”。 這門課程學習的是面向對象分析和設計的核心技能的重要工具。對於使用面向對象技術和語言來,創建設計良好、健壯且可維護的軟件來說,這門課程所

最大熵學習筆記預備知識

color wrap targe dsm entropy plus 文件 eight 相關鏈接 生活中我們常常聽到人們說“不要把雞蛋放到一個籃子裏”。這樣能夠減少風險。深究一下,這是為什麽呢?事實上,這裏邊包括了所謂的最大熵原理(The Maxim

Nginx模塊之Nginx-Ts-Module學習筆記搶險體驗

學習筆記 體驗 nginx模塊 int images clas tps gin issues 1、通過HTTP接收MPEG-TS2、生產和管理Live HLS 3、按照官方的編譯和配置,當然了我是第一次編譯沒有通過,在作者重新調整下,編譯成功,感謝:@arut https:

jq學習筆記

簡單 ren 當前 一個 text 互斥 元素 如果 property 1 .attr() 與 .removeAttr()方法 - atr()方法用來獲取和設置元素屬性 attr()有4個表達式: attr(傳入屬性名):獲取屬性的值 attr(屬性名, 屬性

Redis學習筆記關於在windows64位環境下的安裝學習使用

客戶端 mas key-value 錯誤 services 再次 基準 alt 類型 前言 由於工作需要,目前我正在學習使用Redis。我當時學習Redis就從網上下載了點資料就開始學習了。入門看的是《REDIS入門指南》,這本書個人覺得很適合新手用來學習接觸。根據書上的引

Memcache 學習筆記----Memcache — Linux部署

工作 apach sch trick 解壓 font ash 一個 鍵值   Memcache 一、Memcache簡介(內容摘自 --百度百科)   memcache是一套分布式的高速緩存系統,由LiveJournal的Brad Fitzpatrick開發,但目前被許多網

HtmlParser學習筆記-- 創建Parser對象

nco 修改 英文 text aid 意思 charset 網頁 第一個 首先 ,介紹下HTMLParser的核心類,org.htmlparser.Parser類,這個類實際完成了對於HTML頁面的分析工作。主要的構造函數如下: public Parser ();

Python 學習筆記

pytho oat 變量 情況 class 弱類型 定義 寫代碼 基本上 為什麽學習Python?因為Python 的用處太多了。 本想學會一們語言就好好的維持下去,但是最近Python太火啦,什麽人工智能、網絡爬蟲的,耳濡目染的,心想多學習一些東西總是好的,於是就抽空學習

WPF學習筆記2——動畫效果按鈕變長

anim aud tor col log 筆記 wpf style 分享 說明(2017-6-12 11:26:48): 1. 視頻教程裏是把一個按鈕點擊一下,慢慢變長: 註意幾個方面: (1)RoutedEvent="Button.Click",這裏面要用Button,是

thphp5.0學習筆記

mic tel 序號 app clas world char p s 庫類 1.目錄結構: 其中thinkphp子目錄是框架核心目錄 thinkphp結構: 2.入口文件 默認自帶的入口文件位於public/index.php 應用目錄為application,其結構

Unity Shader學習筆記坐標變換

directx 渲染 系列 約束 shade ace cnblogs 相機 它的 基本問題   試想我們的美術做了一個3D模型,然後渲染引擎把模型渲染到屏幕上。我們還可以選定不同的視角,模擬不同的光照條件去觀察模型。現在來分析一下這個過程。如果說我們把這個過程看成一個函數,

Django學習筆記——安裝,創建項目,配置

lvs csv oot url root import 方式 配置文件 函數 瘋狂的暑假學習之 Django學習筆記(一) 教材 書《The Django Book》 視頻:csvt Django視頻 1.創建項目

ELK學習筆記安裝Elasticsearch、Kibana、Logstash和X-Pack

成功 前端 功能 靈活 日誌分析 傳統 開發人員 收集 還在 最近在學習ELK的時候踩了不少的坑,特此寫個筆記記錄下學習過程。 日誌主要包括系統日誌、應用程序日誌和安全日誌。系統運維和開發人員可以通過日誌了解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日

移動端學習筆記

標簽設置 裏的 none trait 關於 http width 面具 屏幕 <meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=.5,minimum-s