色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

WPF界面框架分層實踐:主題Token、MVVM與換膚避坑

WPF界面框架分層實踐:主題Token、MVVM與換膚避坑 簡介面向 WPF 桌面應用開發(fā)者的一套現(xiàn)代化界面框架源碼與示例適合希望擺脫默認控件外觀、快速搭建統(tǒng)一視覺風格的中級開發(fā)者參考也可作為團隊 UI 規(guī)范與主題定制的基礎。壓縮包約 1.84MB共 336 個文件以 143 個 C# 源碼與 115 個 XAML 界面文件為主體另含 15 個 csproj 工程文件、圖標與圖片素材、Visual Studio 項目模板及少量說明文檔覆蓋控件實現(xiàn)、窗口外殼、主題資源到可復用模板的完整鏈路。目前已有 6464 人學習下載。內(nèi)容圍繞現(xiàn)代化窗口、菜單、對話框與過渡動畫控件展開涉及主題外觀管理與系統(tǒng)版本適配等模塊可據(jù)此理解樣式模板、資源字典與 MVVM 在真實項目中的組織方式并直接改造為自己的應用外殼。1. 一個漂亮的 WPF 界面框架漂亮之外到底解決什么問題上個月幫一個內(nèi)部工具做收尾功能全跑通了評審時被一句話打回來這套 WPF 界面看著像十年前的。真正動手改才發(fā)現(xiàn)難點不在畫得好看而在主色散落在二十多個 XAML 里、按鈕存在三套模板、每個窗口的標題欄各寫各的。這份 WPF 界面框架源碼包就是把這堆散件整理成三層主題 Token、控件模板、窗口外殼再配一套 MVVM 骨架和若干示例頁。它主要解決兩件具體的事改一處顏色不用翻遍工程新頁面照著示例拼就能交付。適合正在用 WPF 做桌面端、要把界面從「能跑」推到「能驗收」的人不適合想找拖拽式設計器、指望完全不寫 XAML 的人。2. 拆目錄結(jié)構(gòu)主題 Token、控件模板、窗口外殼這三層怎么分拿到一個界面框架先別急著運行 Demo也別急著往自己的工程里復制。先看Themes目錄的層次因為它決定了后面所有覆蓋、換膚、定制動作能不能生效。這套框架的劃分是比較典型的做法Tokens放純值顏色、字號、圓角、間距、控件高度Controls放控件樣式與ControlTemplateSkins放皮膚覆蓋Shell放窗口外殼與標題欄。分層的意義在于職責邊界清晰Token 里不該出現(xiàn)任何ControlTemplate控件模板里不該出現(xiàn)任何寫死的#2F6FED。我見過太多項目的資源字典是一個幾千行的Styles.xaml顏色、模板、動畫、轉(zhuǎn)換器全塞在一起。這種文件在項目第三個月就會變成黑匣子誰都不敢刪任何一行因為不知道刪了會影響哪個頁面。分層不是潔癖是為了讓你敢改。2.1 先看資源字典的合并順序它決定后面所有覆蓋能不能生效WPF 在MergedDictionaries里查找同一個 Key 時后加入的字典優(yōu)先級更高。這條規(guī)則很短但它是整套換膚機制的基石。很多人的皮膚切換做不出來原因就一個把皮膚字典加在了 Token 字典前面于是 Token 里的舊值一直勝出換膚看起來「沒反應」。正確的合并順序是先 Token再 Controls最后 Skin。!-- App.xamlxmlns 省略實際工程里按模板生成的寫 -- Application.Resources ResourceDictionary ResourceDictionary.MergedDictionaries !-- 第 1 層純值沒有任何模板。換膚就是換這一層的值 -- ResourceDictionary SourceThemes/Tokens/Colors.Default.xaml/ ResourceDictionary SourceThemes/Tokens/Typography.xaml/ ResourceDictionary SourceThemes/Tokens/Metrics.xaml/ !-- 第 2 層控件模板只允許引用第 1 層的 Key -- ResourceDictionary SourceThemes/Controls/Button.xaml/ ResourceDictionary SourceThemes/Controls/TextBox.xaml/ ResourceDictionary SourceThemes/Controls/Card.xaml/ !-- 第 3 層皮膚覆蓋第 1 層同名 Key必須放最后 -- ResourceDictionary SourceThemes/Skins/Light.xaml/ /ResourceDictionary.MergedDictionaries /ResourceDictionary /Application.Resources這段順序背后有兩條必須記住的規(guī)則。第一條是查找方向MergedDictionaries的檢索是從后往前所以最后加載的皮膚能蓋住前面所有同名 Key。第二條是作用域Application.Resources是全局的窗口和控件會逐級向上查找一旦某一層出現(xiàn)了同名 Key上層的就永遠取不到——調(diào)試時「樣式在別的頁面正常、就這個頁面不對」八成是這個頁面的Window.Resources里藏了一個同名項??绯绦蚣脮r路徑要改成 pack URI比如pack://application:,,,/YourApp;component/Themes/Tokens/Colors.Default.xaml程序集名寫錯的話運行時會拋IOException而不是編譯錯誤這也是常見的第一道問題。2.2 顏色、字號、圓角三組 Token為什么主色要用 DynamicResourceToken 層只做一件事把「設計決定」變成「命名常量」。這套框架里大致是三類鍵名前綴即語義分類示例 Key典型值說明顏色Color.Accent.Base#2F6FED主色另配 Hover、Pressed 兩檔顏色Color.Surface.Card#FFFFFF卡片、面板底色字號Font.Size.Body13正文另有 Caption 12、Title 18圓角Radius.Control6按鈕、輸入框統(tǒng)一圓角間距Space.Unit8所有間距取它的整數(shù)倍尺寸Metric.Control.Height32單行控件標準高度主色不要只給一個值Hover 和 Pressed 要手調(diào)出來別用Opacity疊。原因是透明疊加的結(jié)果依賴背景色同一個按鈕放在白色卡片和深色側(cè)欄上淺色疊加出來的效果完全不同深色背景上會發(fā)灰。這是很常見的視覺問題單看沒問題一放到深色區(qū)域就顯得臟。!-- Tokens/Colors.Default.xaml -- ResourceDictionary xmlns... xmlns:x... !-- 主色三檔Hover/Pressed 手工調(diào)深保證在深色和淺色背景上都成立 -- Color x:KeyColor.Accent.Base#2F6FED/Color Color x:KeyColor.Accent.Hover#245BD0/Color Color x:KeyColor.Accent.Pressed#1C48A8/Color !-- Brush 單獨一層控件模板里用 Brush換膚時只換 Brush 即可 -- SolidColorBrush x:KeyBrush.Accent.Base Color{StaticResource Color.Accent.Base}/ SolidColorBrush x:KeyBrush.Accent.Hover Color{StaticResource Color.Accent.Hover}/ SolidColorBrush x:KeyBrush.Text.OnAccent Color#FFFFFF/ SolidColorBrush x:KeyBrush.Surface.Card Color#FFFFFF/ !-- 字號與度量數(shù)值型 Token 用 sys:Double必須帶命名空間 -- sys:Double x:KeyFont.Size.Body13/sys:Double sys:Double x:KeyFont.Size.Title18/sys:Double CornerRadius x:KeyRadius.Control6/CornerRadius sys:Double x:KeyMetric.Control.Height32/sys:Double /ResourceDictionary關鍵在于「顏色」和「畫筆」分成兩層。Color是不可變結(jié)構(gòu)體SolidColorBrush才是控件屬性真正吃的東西模板里引用的必須是 Brush。數(shù)值型 Token 要注意類型x:Double需要引入sys命名空間clr-namespace:System;assemblySystem.Runtime不同目標框架程序集名略有差異CornerRadius直接寫元素即可不用額外命名空間?,F(xiàn)在說DynamicResource和StaticResource怎么選這是最常被問的一個問題。結(jié)論是會隨皮膚變化的 Key 用DynamicResource永不變的 Key 用StaticResource。StaticResource在 XAML 解析時就把值取出來定死換膚后不會重新求值所以把主色用StaticResource引到模板里切皮膚必然失敗DynamicResource每次取值走一次資源查找會帶來額外開銷在DataGrid單元格模板、ItemsControl項模板這種會實例化成千上萬次的地方能靜態(tài)就靜態(tài)。我的習慣是Token 里跟顏色相關的全用DynamicResource字號、圓角、間距這類換膚不動的用StaticResource。這個劃分一句話能記住后面維護的人也不會亂改。2.3 拆一個按鈕從 Token 到 ControlTemplate 的完整鏈路理解了層次再拆一個具體控件看看這套框架里一個主按鈕是怎么拼起來的。這段值得逐行讀因為它是后面所有控件的模板。!-- Controls/Button.xaml只引用 Token不出現(xiàn)任何字面色值 -- Style x:KeyButton.Primary TargetTypeButton Setter PropertyHeight Value{StaticResource Metric.Control.Height}/ Setter PropertyMinWidth Value72/ Setter PropertyPadding Value16,0/ Setter PropertyFontSize Value{StaticResource Font.Size.Body}/ Setter PropertyForeground Value{DynamicResource Brush.Text.OnAccent}/ Setter PropertyBackground Value{DynamicResource Brush.Accent.Base}/ Setter PropertyBorderThickness Value0/ Setter PropertyCursor ValueHand/ Setter PropertyTemplate Setter.Value ControlTemplate TargetTypeButton Border x:NameBd Background{TemplateBinding Background} CornerRadius{StaticResource Radius.Control} SnapsToDevicePixelsTrue ContentPresenter HorizontalAlignmentCenter VerticalAlignmentCenter Margin{TemplateBinding Padding} RecognizesAccessKeyTrue/ /Border ControlTemplate.Triggers !-- 順序有講究后定義的觸發(fā)器優(yōu)先級更高 -- Trigger PropertyIsMouseOver ValueTrue Setter TargetNameBd PropertyBackground Value{DynamicResource Brush.Accent.Hover}/ /Trigger Trigger PropertyIsPressed ValueTrue Setter TargetNameBd PropertyBackground Value{DynamicResource Brush.Accent.Pressed}/ /Trigger Trigger PropertyIsEnabled ValueFalse Setter TargetNameBd PropertyOpacity Value0.45/ Setter PropertyCursor ValueArrow/ /Trigger /ControlTemplate.Triggers /ControlTemplate /Setter.Value /Setter /Style這里有幾個容易被忽略的細節(jié)每一個都可能變成后期幾分鐘甚至幾小時地去排查的問題。第一TemplateBinding是單向的、不支持轉(zhuǎn)換器且只能綁到模板化父級的屬性上。所以Padding能綁Background能綁但如果你想把Background轉(zhuǎn)成漸變就必須換成{Binding Background, RelativeSource{RelativeSource TemplatedParent}}再掛 Converter?;煊眠@兩者時不要抱有僥幸心理模板里一旦出現(xiàn)轉(zhuǎn)換需求就整體換成Binding。第二觸發(fā)器順序決定最終效果。IsMouseOver和IsPressed同時為真時后定義的IsPressed生效所以按下色必須寫在懸停色后面。反過來寫按下時看到的還是懸停色看起來就像「按下沒反饋」。第三IsEnabledFalse時如果只改OpacityCursorHand依然生效鼠標移上去還是手型用戶會以為可以點。所以禁用態(tài)要順手把Cursor也改回來這類細節(jié)在驗收時最容易被挑出來。最后控件模板里不要出現(xiàn)字面色值這是硬性約束。只要模板里出現(xiàn)一個#2F6FED換膚那一刻它就會變成色塊不一致的元兇而且很難靠肉眼定位到具體是哪個模板。框架里這類違規(guī)用一次文本搜索就能找出來接入前先搜一遍#順手清理掉。3. 接入現(xiàn)有工程從復制目錄到跑出第一個頁面3.1 目錄落位與 csproj 里的資源聲明把整個工程復制進來是最快的驗證方式但真正接入現(xiàn)有項目時建議只復制Themes和Infrastructure兩個目錄示例頁按需挑選著拿。目錄放在項目根下即可不要塞進Properties或者obj旁邊obj目錄在清理時容易誤刪。csproj這塊有個高頻問題SDK 風格工程的默認 glob 已經(jīng)把**/*.xaml編譯成Page你再手寫一遍Page IncludeThemes\**\*.xaml /就會報重復項NETSDK1022。所以大部分情況下什么都不用寫只在需要排除或者改變構(gòu)建方式時才動它。ItemGroup !-- 默認 glob 已包含 **/*.xaml這里只做排除草稿目錄不參與編譯 -- Page RemoveThemes\_draft\**\*.xaml / !-- 字體、圖標這類二進制資源用 Resource隨程序集嵌入pack URI 才取得到 -- Resource IncludeAssets\Fonts\*.ttf / Resource IncludeAssets\Icons\*.png / !-- 示例數(shù)據(jù)用 Content 復制到輸出目錄別用 Resource 塞進程序集 -- Content IncludeSampleData\*.json CopyToOutputDirectoryPreserveNewest / /ItemGroup構(gòu)建項的選擇直接決定資源能不能取到這張表建議存下來構(gòu)建項編譯結(jié)果適用場景取用方式Page編譯為 BAML所有 XAML包括資源字典Source相對路徑Resource嵌入程序集字體、圖標、小圖片pack://application:,,,/程序集;component/路徑Content原樣復制到輸出目錄示例數(shù)據(jù)、可替換配置相對輸出目錄的路徑None不處理文檔、說明無字體用Resource嵌入之后在 XAML 里通過FontFamily/Assets/Fonts/#字體內(nèi)部名引用注意斜杠后面那個#后面跟的是字體家族名不是文件名。寫錯了不會報錯只會靜默回退到系統(tǒng)默認字體——這類靜默失敗最耗時間。3.2 App.xaml 合并字典與運行時換膚皮膚切換不要用「先清空再添加」的寫法。清空MergedDictionaries會在瞬間讓所有DynamicResource失效控件重繪時可能拋出找不到資源的異常而「只添加不移除」會讓字典越積越多切換五十次之后內(nèi)存和查找開銷都會肉眼可見地上漲。正確做法是把皮膚字典固定在MergedDictionaries的最后一位換膚就是替換這一項。public static class ThemeManager { // 皮膚字典固定放在 MergedDictionaries 的末位替換這一項即為換膚 private static readonly Uri LightSkin new(pack://application:,,,/YourApp;component/Themes/Skins/Light.xaml); private static readonly Uri DarkSkin new(pack://application:,,,/YourApp;component/Themes/Skins/Dark.xaml); public static void Apply(bool dark) { var merged Application.Current.Resources.MergedDictionaries; if (merged.Count 0) return; var skin new ResourceDictionary { Source dark ? DarkSkin : LightSkin }; // 關鍵替換而不是 Add避免字典無限增長 merged[merged.Count - 1] skin; } }替換完成后不需要手動刷新任何控件DynamicResource會自動重新求值。這里有個前提所有隨皮膚變化的引用必須是DynamicResource只要模板里漏了一個StaticResource換膚后那個控件就會保持舊色在一片新配色里顯得很突兀。還要注意換膚的時機。啟動時在App構(gòu)造函數(shù)里調(diào)用是最穩(wěn)的如果放在窗口Loaded之后用戶會看到一次明顯的閃爍。真想做到無閃爍就得在窗口顯示前把皮膚定好也就是把配置讀取提前到App初始化階段。3.3 無邊框窗口外殼與自定義標題欄這套框架的外殼用的是WindowChrome而不是WindowStyleNone加AllowsTransparencyTrue。后者雖然也能做出無邊框效果但會讓窗口失去硬件加速路徑拖動和縮放時明顯發(fā)澀圓角邊緣還會有鋸齒。WindowChrome保留系統(tǒng)窗口的非客戶區(qū)行為只把繪制權(quán)交給你。!-- Shell/AppWindow.xaml無邊框外殼保留系統(tǒng)縮放與拖拽行為 -- Window x:ClassYourApp.Shell.AppWindow WindowStyleNone ResizeModeCanResize AllowsTransparencyFalse Background{DynamicResource Brush.Surface.Card} !-- CaptionHeight頂部可拖拽區(qū)高度等于標題欄高度 -- !-- ResizeBorderThickness邊緣拖拽熱區(qū)觸屏場景建議放大到 8 -- WindowChrome.WindowChrome WindowChrome CaptionHeight40 ResizeBorderThickness6 GlassFrameThickness0 CornerRadius0 UseAeroCaptionButtonsFalse/ /WindowChrome.WindowChrome Grid Grid.RowDefinitions RowDefinition Height40/ RowDefinition Height*/ /Grid.RowDefinitions !-- 標題欄區(qū)域內(nèi)的按鈕必須聲明 IsHitTestVisibleInChrome否則點不到 -- StackPanel Grid.Row0 OrientationHorizontal HorizontalAlignmentRight WindowChrome.IsHitTestVisibleInChromeTrue Button Content— Style{StaticResource Button.Caption}/ Button Content□ Style{StaticResource Button.Caption}/ Button Content× Style{StaticResource Button.Caption}/ /StackPanel ContentPresenter Grid.Row1 Content{Binding Body}/ /Grid /Window三個參數(shù)決定了使用手感。CaptionHeight要和標題欄那一行的高度嚴格對齊寫 40 就是 40寫小了頂部會剩一條既不能拖也不能點的死區(qū)ResizeBorderThickness在鼠標場景 6 夠了觸屏設備建議 8 到 10否則邊緣拖不動GlassFrameThickness0去掉系統(tǒng)玻璃層避免深色皮膚下邊緣發(fā)亮。標題欄里的按鈕必須加WindowChrome.IsHitTestVisibleInChromeTrue這一條不加按鈕會變成「看得見點不著」鼠標事件被拖拽區(qū)吃掉了。這是無邊框窗口最常見的一個問題排查時容易往命令綁定上想繞一圈才發(fā)現(xiàn)是命中測試。另一個是最大化蓋住任務欄。無邊框窗口最大化時系統(tǒng)給的尺寸包含非工作區(qū)直接鋪滿會頂?shù)羧蝿諜凇:唵蔚淖龇ㄊ窃诖翱跇?gòu)造里設MaxHeight SystemParameters.MaximizedPrimaryScreenHeight多顯示器場景下這個值只在主屏正確需要監(jiān)聽WM_GETMINMAXINFO自己算工作區(qū)框架的Shell目錄里有對應的輔助類接入時按屏幕數(shù)量確認一下。3.4 驗收入口DPI、縮放、多屏的檢查清單界面框架接進去功能點兩下都正常不代表能交付。下面這張表是我每次接入必過的一遍成本不到十分鐘能提前擋掉大部分返工。檢查項操作不通過的表現(xiàn)單屏 100%系統(tǒng)縮放調(diào)到 100%逐頁翻一遍1px 邊框消失或變粗單屏 150%縮放到 150%看文字與圖標文字發(fā)虛、圖標模糊多屏不同縮放兩屏分別設 100% 和 150%拖窗口來回拖到另一屏后整體變糊高對比度切換系統(tǒng)高對比度主題文字與背景同色看不見觸摸觸屏設備上點邊緣縮放邊緣拖不動最小尺寸拖到最小寬高標題欄按鈕被擠出可視區(qū)DPI 那一欄解釋一下WPF 是邏輯像素體系縮放變化時如果圖片資源只準備了一份系統(tǒng)會拉伸結(jié)果就是模糊。圖標盡量用矢量路徑位圖則按 100%、150%、200% 各備一份靠Image的尺寸選擇邏輯去匹配。這條不做用戶在 150% 縮放的筆記本上第一眼就會覺得「這軟件有點舊」。4. MVVM 骨架命令、通知、導航與對話框怎么切界面層的活干完接著看骨架。這套框架的Infrastructure目錄里放的是一套很薄的基礎設施ViewModelBase、RelayCommand、AsyncCommand、導航服務、對話框服務。判斷一套 MVVM 骨架好不好標準只有一條ViewModel 里能不能完全不出現(xiàn)Window、MessageBox、Application.Current。出現(xiàn)了單測就廢了復用也別想了。4.1 ViewModelBase屬性通知與 SetProperty 的寫法public abstract class ViewModelBase : INotifyPropertyChanged { public event PropertyChangedEventHandler? PropertyChanged; // 返回 bool方便 setter 里鏈式通知派生屬性 protected bool SetPropertyT(ref T field, T value, [CallerMemberName] string? name null) { // 用 EqualityComparer 而不是 object.Equals避免值類型裝箱 if (EqualityComparerT.Default.Equals(field, value)) return false; field value; OnPropertyChanged(name); return true; } protected void OnPropertyChanged([CallerMemberName] string? name null) PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); }CallerMemberName省掉了手寫屬性名字符串改屬性名時不會漏改通知。相等判斷用EqualityComparerT.Default而不是因為泛型里對值類型是裝箱比較屬性高頻更新時這點開銷會積少成多。返回bool是個很實用的小設計if (SetProperty(ref _name, value)) OnPropertyChanged(nameof(DisplayName));這樣派生屬性只在真正變化時通知避免無謂的綁定刷新。老項目里常見的寫法是 setter 里連續(xù)調(diào)三次OnPropertyChanged每次輸入都觸發(fā)一輪完整重算。集合屬性是另一個問題點。ObservableCollectionT不要每次賦值都new那等于讓ItemsControl重建整個視圖樹滾動位置會跳回頂部。正確做法是初始化一次之后用Clear()加Add()更新。4.2 RelayCommand 與 AsyncCommandCanExecute 刷新時機的坑public sealed class RelayCommand : ICommand { private readonly Actionobject? _execute; private readonly Funcobject?, bool? _canExecute; public RelayCommand(Actionobject? execute, Funcobject?, bool? canExecute null) { _execute execute ?? throw new ArgumentNullException(nameof(execute)); _canExecute canExecute; } public bool CanExecute(object? parameter) _canExecute?.Invoke(parameter) ?? true; public void Execute(object? parameter) _execute(parameter); public event EventHandler? CanExecuteChanged { add CommandManager.RequerySuggested value; remove CommandManager.RequerySuggested - value; } // 手動觸發(fā)異步命令結(jié)束、集合變化后必須調(diào) public void RaiseCanExecuteChanged() CommandManager.InvalidateRequerySuggested(); }CommandManager.RequerySuggested是隱式刷新只在鍵盤、鼠標等輸入事件之后觸發(fā)。這意味著如果你在后臺線程里改了某個標志位按鈕的可用狀態(tài)可能要等到用戶點一下別的地方才更新。血淚經(jīng)驗是異步命令執(zhí)行完畢、批量數(shù)據(jù)加載完成這類時刻必須顯式調(diào)一次RaiseCanExecuteChanged()否則用戶會看到「按鈕還是灰的但功能其實已經(jīng)好了」。異步命令額外要處理兩件事。一是防重入執(zhí)行中把CanExecute置為false避免用戶連點三次發(fā)出三個請求。二是異常兜底async void里拋出的異常會直接打到未處理異常上進程就掛了??蚣芾锏腁syncCommand用try/catch包住執(zhí)行體把異常交給注入的錯誤處理器再由它彈提示。public sealed class AsyncCommand : ICommand { private readonly Funcobject?, Task _execute; private readonly Funcobject?, bool? _canExecute; private bool _isRunning; // 防重入標志 public AsyncCommand(Funcobject?, Task execute, Funcobject?, bool? canExecute null) { _execute execute; _canExecute canExecute; } public bool CanExecute(object? parameter) !_isRunning (_canExecute?.Invoke(parameter) ?? true); public async void Execute(object? parameter) { if (_isRunning) return; _isRunning true; RaiseCanExecuteChanged(); try { await _execute(parameter); } catch (Exception ex) { // 必須兜住async void 里的異常無處可去 ErrorHandler?.Invoke(ex); } finally { _isRunning false; RaiseCanExecuteChanged(); } } public event ActionException? ErrorHandler; public event EventHandler? CanExecuteChanged; public void RaiseCanExecuteChanged() CanExecuteChanged?.Invoke(this, EventArgs.Empty); }AsyncCommand我沒有復用CommandManager而是自己維護CanExecuteChanged。原因是異步場景下按鈕狀態(tài)變化跟輸入事件沒有必然關系走隱式刷新容易失準自己控制雖然要多調(diào)幾次RaiseCanExecuteChanged但行為可預期。4.3 導航與對話框接口怎么切才不綁死 UI接口切分的目標是讓 ViewModel 只描述「要什么」不描述「怎么顯示」。這張表是框架里的切法接口職責不該做的事INavigationService按 ViewModel 類型切換主區(qū)域內(nèi)容不引用具體Page、Window類型IDialogService確認框、輸入框、等待提示不直接調(diào)MessageBoxINotificationService頂欄消息、Toast不持有具體控件的引用IThemeService讀取與切換皮膚不碰Application.Resources的索引public interface IDialogService { // 返回 Task調(diào)用方 await 之后拿結(jié)果避免回調(diào)地獄 Taskbool ConfirmAsync(string title, string message); Taskstring? PromptAsync(string title, string message, string? defaultValue null); }實現(xiàn)側(cè)常見的做法是用一個覆蓋全窗口的ContentControl加半透明遮罩把對話框內(nèi)容當作普通控件渲染返回值靠TaskCompletionSourcebool在用戶點擊時SetResult。這樣對話框也吃同一套 Token深色皮膚下不會出現(xiàn)一個白底黑字的系統(tǒng)彈窗視覺上跳出來。這里要提醒一點TaskCompletionSource必須用TaskCreationOptions.RunContinuationsAsynchronously否則SetResult會在 UI 線程上同步跑完整個await后續(xù)邏輯遇到重活就卡界面。這個問題非常隱蔽表現(xiàn)為「點確認之后界面頓一下」把選項加上就好。5. 避坑記錄樣式不生效、內(nèi)存上漲、DPI 模糊的排查順序這一章是這份框架里最值得先讀的部分。下面四條都是我在真實接入里遇到過的每一條按現(xiàn)象、原因、解決的順序?qū)懹龅酵悊栴}時可以照著順序查。5.1 現(xiàn)象改了 Token控件紋絲不動現(xiàn)象把Color.Accent.Base從藍改成橙重新生成主按鈕還是藍的。清緩存、重啟 IDE 都試過仍然是藍。原因控件模板里引用的是{StaticResource Brush.Accent.Base}。StaticResource在 BAML 解析階段就把值取出來寫死了后續(xù)字典變化對它沒有任何影響。另一種可能是這個頁面的Window.Resources里定義了一個同名的Brush.Accent.Base局部作用域優(yōu)先全局的改動被它遮住。解決在解決方案里搜StaticResource Brush.凡是顏色類的引用全部換成DynamicResource再逐頁檢查Window.Resources和UserControl.Resources里有沒有同名 Key。這兩步做完改動立即生效。我的習慣是把這條寫進代碼評審清單模板里出現(xiàn)StaticResource后面跟Brush.前綴的一律打回。5.2 現(xiàn)象切幾次皮膚內(nèi)存一路往上走現(xiàn)象在設置頁反復切換淺色和深色任務管理器里的內(nèi)存從 180MB 漲到 400MB 不回落切得越多漲得越多。原因換膚實現(xiàn)寫成了merged.Add(skin)每次切換都往MergedDictionaries里追加一個字典舊字典既沒被移除也沒被回收資源查找還得從后往前遍歷一長串。另一個隱性原因是畫筆沒凍結(jié)SolidColorBrush每次創(chuàng)建都是新的可凍結(jié)對象沒調(diào)Freeze()就參與變更通知無法被共享。解決換膚改成替換末位元素見 3.2 的寫法Token 里所有SolidColorBrush在創(chuàng)建后調(diào)一次Freeze()凍結(jié)后的畫筆可以被多個控件共享內(nèi)存占用會明顯下降。改完再測反復切換五十次內(nèi)存曲線基本走平。提示Freeze()只能用于可凍結(jié)對象而且凍結(jié)后不能再改屬性。如果某個畫筆需要在運行時調(diào)色就別凍結(jié)它。5.3 現(xiàn)象4K 屏上字體發(fā)虛、1px 邊框消失現(xiàn)象開發(fā)機 100% 縮放一切正常換到 150% 縮放的筆記本上正文明顯發(fā)糊卡片之間的 1px 分隔線時有時無圓角處還有毛邊。原因三個疊加問題。位圖圖標只準備了一份系統(tǒng)拉伸導致模糊Border的BorderThickness用了1但沒開UseLayoutRounding和SnapsToDevicePixels在非整數(shù)縮放比下 1px 被攤到兩個物理像素上顏色被稀釋到看不見再就是窗口設了AllowsTransparencyTrue透明窗口在部分縮放下失去硬件渲染路徑。解決圖標改用矢量路徑在外殼根元素上開UseLayoutRoundingTrue需要像素對齊的Border和Image加SnapsToDevicePixelsTrue無邊框窗口換回WindowChrome方案。三條一起改150% 下再對比截圖邊緣和文字都恢復銳利。5.4 現(xiàn)象設計器里正常運行時拋 XamlParseException現(xiàn)象XAML 在設計器里預覽得好好的一運行就拋XamlParseException提示找不到某個資源堆棧指向一個看起來沒問題的Setter。原因StaticResource的解析是編譯期決定的它只能向前查找——引用必須出現(xiàn)在定義之后或者定義在更早就合并的字典里。設計器有時會更寬松地加載于是出現(xiàn)「設計器能看、跑起來就崩」。另一種原因是跨程序集引用時 pack URI 里的程序集名寫錯編譯期不校驗運行時才爆。解決先在App.xaml里把 Token 字典排在最前面確保所有模板在后面再檢查所有跨程序集的Source程序集名、大小寫、component關鍵字都要對上。定位技巧是把App.xaml里的合并字典臨時注釋掉一半二分法很快能鎖定是哪個文件。5.5 常見問題速查表癥狀第一嫌疑快速驗證換膚后個別控件不變色模板里用了StaticResource全工程搜StaticResource Brush.按鈕點不動標題欄命中測試被吃檢查IsHitTestVisibleInChrome最大化蓋住任務欄無邊框窗口的尺寸計算看MaxHeight是否按工作區(qū)算列表刷新后滾動條跳頂集合被整體new檢查ObservableCollection賦值處命令按鈕一直灰隱式刷新未觸發(fā)手動調(diào)一次RaiseCanExecuteChanged字體不是預期那個FontFamily的家族名寫錯核對#后面是家族名而非文件名6. 進階把換膚做成可以回歸驗證的流程界面類的改動最難驗證因為它「看起來沒問題」和「確實沒問題」之間差得很遠。這套框架里我最常用的一個技巧是把換膚做成可以對比的回歸流程。第一步把 Token 抽出來做一份中間格式??蚣艿腡okens目錄本身就是鍵值對用幾十行代碼掃一遍 XAML把Color.*、Font.Size.*、Radius.*導出成 JSON交給設計側(cè)對齊。之后設計師改配色改的是這份 JSON工程師用腳本回寫 XAML比在群里發(fā)色值截圖靠譜得多?;貙懩_本要注意保留原有的x:Key順序和縮進否則每次生成都是幾百行 diff評審時沒人看得下去。第二步準備一個「Token 全覽頁」。把所有 Token 渲染成色塊、字號樣例、圓角樣例配上鍵名放在調(diào)試菜單里。換膚以后直接翻這一頁哪個鍵沒被覆蓋一眼就能看出來。這個頁面我一般不到半小時就能拼完但省下來的排查時間遠超投入。第三步截圖比對。把關鍵頁面在淺色和深色下各截一張存在版本庫里改了樣式之后重新截用逐像素差值定位變化區(qū)域。閾值不要設在零字體渲染有亞像素抖動允許千分之三以內(nèi)的差異超過就是真改了。這套流程跑順之后改一個 Token 影響哪些頁面提交前就能知道。還有一個小習慣值得說一下每次接入新的界面框架我都會先在空工程里跑一遍它的 Demo把所有頁面點一遍重點看深色皮膚下的對比度和禁用態(tài)。原因很簡單這些地方最容易藏問題而在自身工程里樣式問題會被業(yè)務邏輯掩蓋很難判斷到底是框架的問題還是你寫錯了。從那以后我每次往項目里引 UI 框架都強制先走一遍這套空工程驗證再動業(yè)務代碼。希望幫到你。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久久久96| Blackedraw视频一区二区| 亚洲欧美日韩精品久| 超碰久久中文| 99热婷婷一区二区三| 国产91乱伦| 一二三啪啪专区| 五月天婷婷社区| 国产精品一区二区 尿失禁| 久久久久久九九九九-美女久久久久久久-成人AV | 偷拍自拍在线视频观看| 综合亚洲情色| 亚洲欧美日韩制服另类| 国模限制级电影| 33044男人的天堂深夜备| 国产精品无码av在线| 色爱欲亚洲| 欧美精品庄| 综合色啪| 日日干日日摸| 色999五月色| 久久一二三四不卡| 岛国AB视频| 丝袜av一区二区三区| 国产拍偷精品网站| 一区中文字幕二区日韩| 日本人妻伦在线中文字幕| 人妻久热在线| 精品一区二区三区免费古装毛片香港三级日本三级人妇 | 久久久婷婷| 欧美日日人人天天| 国产超碰人人操| 久热网| 久久精品国产96精品亚洲拳交| 欧美亚洲涩涩| 日韩无码黄色片| 久草精品视频| 91碰碰| 精品对白久久不卡| 美欧老女人97| 六月丁丁香| 97干在线| 75大香蕉| 免费精品人妻一区二区三| 人妻免费观看| 色青青久久影视| 欧洲一区二区| 欧美少妇熟女| 中文字幕一区二区在线日韩精品| 欧洲站一级二级三级h| 岛国小电影| 欧美亚洲综合色| 亚洲成人精品久久久| 男女做爰猛烈动高潮A片免费应用| 狠狠久久四虎| 欧美大香蕉专区网| 亚州性色| 懂色av中文字幕一区二区三区天美 | 操逼免费视频无码国产| 欧洲亚洲人妻无码高清久久三区四区| 中文字幕一区 二 区 三 四 五 区日 日 骚| 日韩欧美亚洲自拍偷拍| 天天干夜夜操一区二区| 色综合美国| 乱抡国产91| 日韩一级二级三级免费看完整版国语版 | 射丝袜高跟鞋99| 国产亚洲精品A在线观看下载| 亚洲电影91| 五月丁香六月激情| 国产对白刺激视频| 欧美少妇人妻| 日韩干B| 操碰97| 美女操逼A A| 国产女主播视频在线观看| 97九色人妻| 福利操逼| 亚洲在线a| 亚州色图狠狠干| 男男H黄动漫啪啪无遮挡网站| 欧美激情亚洲| 熟妇人妻一区二区三区| 人成午夜免费大片| 永久免费av无码网站国产app| 97国产精选| 一区久久久二区| www成人啪啪18秘 免费| 东京热一区二区中文字幕| 中国的操老妇女| 日韩人妻操B| av片在线观看免费播放| 欧美亚洲一级在线观看| 色吧 综合| 日韩在线观看AV| 中文字幕综合人妻| 五月天社区| 亚洲导航深夜福利| 6080YYY午夜理论片在线观看| 9精品久久久久| baiduhicn.com。| 久久综合五月天| 亚洲第一狼人丝袜美女另类| 99热在线观看| 黄站在线免费观看| 人妻少妇久久| 久日91在线| 国产一区96在线| 国产在线视视频有精品| 久久久久成人亚洲国产| 免费黄色片。| 欧美性爱日韩高清| 日韩欧美性吧婷婷乱伦大香蕉 | 99热这里都是精品| 乱伦熟女区| 久久精品国产亚洲AV嘿嘿| 亚洲欧美色图片| 色天天野狼综合社区| 热久久国产精品视频大陆精品| 欧美亚州手机在线| 五月丁香啪| 丁香六月东京热| 色就色综合| 人人操人人干xxx| 蜜桃久久一区二区| 男人的午夜天堂| 深夜激情| 欧美一级在线观看成人| 色欲三区| 久久久久久一日韩字幕无码| 久久久精品视频免费观看| 尹人免费观看视频在线| 欧美性xxxxx狂欢| 日韩精品-原创伙伴| 青娱乐妇女性生活| 少妇久久| 老熟妇乱轮| 91操操操操| 亚洲成a人v欧美综合天堂下载| 青青草这里只有精品| 亚洲精品1区| 日影院久久婷婷夜夜网| 亚欧操逼片在线观看| 亚洲人91| 久久r精品| 97日韩欧美亚洲| 中文子幕一二三| 中文在线视频| 国内97干免费看| 色偷偷综合91久久噜噜| 四方色播| 青娱乐福利99| 一级性爱啪啪视频| 午夜偷拍久久熟女| 久操高青| 久久99草| 精品久操| 亚洲日韩国产精品| 性爱综合一区二区| 99热精品在线在线| 图色综合网| 一级黄碟在线观看| 久九9精品| 大香交| 97Ai亚洲| 国语国产操逼伊人AV网| 亚洲欧洲综合视频在线| 欧美色三级片91| 综合久欧洲| 久久精品夜色国产亚洲AV| 青青欧洲黑| 人妻夜爽夜夜爽| 欧美色图电影| 天天操人人操狠狠插| 2019久久久久久久久福利| 亚欧性爱ab| 99re视频在线观看这里只有精品| 亚洲中文人妻色| 国产精品久久久久久夜夜夜夜| 久久久久成人网| 亚洲 欧美 精品专区 极品| 人妻中文字幕精品无码| 4399成人黄A片| 欧美专利1区2区3区4区5区免费| 99抽插| 台湾佬中文娱乐网久久久久久久久久com| 青青五月天| 翔田千里爆乳巨臀无码| 婷婷丁香六月| 日韩久久艹| 欧美,亚洲,日韩,v,天堂,手机在线观看 | 九九综合九九综合| av一区二区三区 中文| 最新加勒比丝袜在线| 中文字幕AV片| 东京热一区二区中文字幕| 欧美日韩 强奸乱伦| 人妻嗯啊啊在线播放| 大香蕉国产中文自拍| 欧美96在线|欧| 亚洲免费成人在线高清无码视频| 亚洲性爱高潮影院| 国产人人干| 亚洲天堂欧美| av凤凰久久久| 性性久久| 欧美一区二区日韩三区| 久久欧美按摩999| 啊啊啊啊在线观看网址| 丰满人妻-区二区三区免费看| 亚洲无码偷拍| 久久人妻视频| 97久久久久| 国产强奸超碰AV| 亚洲 se图 欧美电影| 偷拍视频青青草在线视频| 高跟丝袜AV专区国产| 天天肏美女| 亚洲中文sv| 口爆吞精在线观看| 国产免费久久精品99re韩国| 国产午夜在线观看| 26uuu欧美| 91无码人妻| 超碰在线欧美性爱激情| 九九热精品免费视频| 国产美女高潮视频| 婷婷五月av| 欧美中字不卡| 亚洲成a人在线观看久| 亚洲 欧美 小说| 黄片www视频免费| www.婷婷| 另类欧美色| 手机看av网站在线看| 超碰在线第一页| 日韩综合成人免费视频| 好吊色一区| 国产偷人伦激情在线观看| 伊人久久88国产女| 啊啊啊免费视频| 91无码中出人妻视频| 国产精品3| 亚洲暴力强奸AV| 国产精品久久久久久久久久久久久久久久| 国产精品干干干| 天天插夜夜爽| 日韩激情啪啪| julia国产在线| 99综合网| 亚洲色图欧美色图另类图片| 欧美性特| 欧美一区二区三区互相| 国产13区| 中国一级操逼视频| 四虎884a| 日韩人成网站在线播放| 亚洲区小说| 五月婷婷大香蕉| 一本色道久久综合精品婷婷| 美女黄色一级A视频| 亚洲精品97| 久久综合精品一区二区三区| 26uuu国产亚洲综合| 久久亚洲不卡一区二区三区| 日本性爱欧美性爱| 亚洲女人毛茸茸91| 亚洲麻豆精品二区三区| 免费观看性欧美一级| 婷婷久草| 超碰97爽| 欧美性生活免费网| 天天综合欧美黑人| 女同亚洲欧美一二三区久久电影| 乱操乱伦AV| 欧美日韩电影一区二区| 5278欧美一区二区三区| 久久超碰日韩精品| 欧美韩国你懂得在线| 亚洲 国产 精品一区| 99热精品在线观看| 91在线免费观看处女| 美国精品国产精品| 91欧美网| 欧美日韩大陆黑人少妇99| 亚洲暴力强奸AV| 少妇天堂| 75大香蕉| 久久性爱免费送| 中文字幕在线免费观看 | 欧美精品成人一区二区在线观看| 亚洲九九爱| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 亚洲欧洲激情卡通另类文学四射小说网站 | 91天美传媒在线| 在线国产探花| 天天躁日日躁xxxxx| 黄站在线免费观看| 大香蕉在线86| 五月激情啪啪| 97精品熟女少妇一区| 91成人精品| 极品内射| 丁香五月色情| 亚洲最大的综合性av| 久久久日本电影| 大乔未久88一区| 99色| 91小视频| 美女操逼A A| 果冻传媒A片麻豆熟妇人妻| 情色AV电影| 久久精品店| 韩国免费播放一级毛片| 一区二区三区麻豆| 手机av亚洲丝袜美腿日韩第一页二页| 亚洲s在线观看| 国产一区二区三区精品观看啪| 91P0RNY大屁股人妻| 91无码人妻精品一区二区三区蜜桃| 91久久18禁| 日本狠狠干| 国产色呦呦| 国产强奸乱伦xd| 综合 亚洲 欧美| 久久久久久裸体| 麻豆福利视频导航| 一本一道人妻久久一区二区三区 | 亚洲双插| 麻豆天美在线喷水AV| renqi久久久久久久久久久久| 亚洲日韩美国人妻| 性色av大全| yiqicaoav| 国产97在线播放| 欧美青青视频| 亚州熟妇精品| 国产丰满熟夫69mpp| 婷婷三区| 热久久精品| 混色激情av| 久久香蕉网| 成人av动漫在线观看| 黄色AAAAA欧美| 欧美激情性爱视频网站| 99老司机精品视频在线观看| 性爱视频无打码在线观看| 色欲天天综合久久久无码网中文| 啊啊啊好想要| 久久精品人妻一区| 天美传媒婬乱| 十八禁啪啪视频| 999久久久| 日本一区二区中文字幕久久| 在线日韩精品一区二区三区| 伊人操你| 久久久久亚洲av综合波多野制衣| 看大黄色大片原件| 综合欧美激情网| 综合操逼| 国产亚州精品美女久久久免费| 国产精品亚洲高清在线| 久草免费福利在线播放| 韩国黄片aaaa| 小情侣高清国产在线视频| 亚洲天堂7777| wwwss在线观看| 伊人五月天| 女人爽到高潮久久久| 中文啪啪视频| aaa淫乱视频| 亚洲黄色网址| 精产品久久| 欧美天天射| 熟女熟妇一区二区三四区| 青青青青操国内视频在线| 粉嫩av一区二区三区天美传媒 | 超碰97国产欧美| 四方色播| 中文AV制服乱伦| 操迟操逼在巾线Fre看| 国产精品干干干| 激情抓乳插进去啪啪啪日韩 | 91久久久视| 9999亚洲精品| 东北女人性交| 97久操| 校园春色亚洲| 一起草日韩| 精品亚洲国产成人AV制服丝袜| 中文字幕 码精品视频网站| 超碰亚洲欧美日韩无| 亚洲成人精品久久久| 五毛骚逼极品美女怕怕| 亚洲高清欧美总合| 国产又色又粗又黄又爽| 欧美三级中文字幕hd| 国产玖玖| 久草精品一区 | 国产夜夜艹| 国产白丝在线| 精品人妻一区二区三区不卡断| 亚洲中字幕日本一区二区三区| 国产女人与拘做受视频免费| 欧美在线播放aaaa| 中文字幕av久久爽Av| Julia Annxxxxx| 天天久久| 国产成人无码a| 亚洲欧洲网站免费观看| 狠狠热这里都是精品| 人妻 欧美亚洲| 亚洲精品久久久久毛片A片拉屎 | 成人免费在线网站| 久久亚州高清| 欧洲综合色| 麻花豆传媒剧国产MV出差| 精品性爱一二三区| 亚洲图片 91| 色五月激情AV在线| 亚洲欧洲日本精品中文a∨| 超碰人人超在线观看| 女人妻一区| 久超碰这里只有精品| a片在线播放| 97色婷| 97精品97久久| 亚洲自拍偷拍视频在线| 日韩中文字幕二区| 狠狠干妹子| 亚洲性爱成人| 欧洲天天在线| 精品人妻一区二区三区不卡断 | 欧美操逼熟女| 884t在线| 青娱乐老司机视频| 99热18| 狠狠爱夜夜干| 日韩国产欧美伦理在线| 久久九九一区二区三区成人| 特色a在线上| 日本福利二区视频| 欧美情色男人的天堂| 亚洲成人ab| 亚洲色图亚洲无码强奸乱伦| 1000午夜黄色| 国产精品 久久久精品一牛| 香蕉99秘 精品一区丁香| 91色欧美| 日本欧美成人片AAAA| 丁香7月婷婷| 久久riav中文精品| 亚洲97p| 97资源视频| 人妻天堂综合网| 国产精品97视频| 国产尹人在线视频免费| 中文字幕无码不卡啪啪| 国产中文精品一区二区在线观看| 欧美日韩一干二干| 老子午夜伦不卡影院| 四虎AV无码| 偷拍亚洲| 久九干| 午夜成人爽爽爽爽A片李冰冰| 无码9区| 亚洲干B| 成人丁香五月| 日本三级精品| 久久婷婷五月天| 天美传媒婬乱在| 免费一级毛片在线视频观看| 精品国产乱码久久久影院| www网站黄| 亚洲 中文 欧美 日韩 在线| 日本黄 R色 成 人网站| 99999国产精品| 天天摸,夜夜摸| 欧美色涩| 九九英色视频| 国产传媒操逼视频| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 国产精品一二三免费网站| 中文字幕激情小说| 久操九九九九| 九九视频黄色片| 欧美成人亚洲精品| 午夜视频久久久久一区| 欧州激情视频在线一区二区| 韩国成人精品久久久免费看| 超碰4A| 97久精品| 国产成人无码啪| 亚洲色天堂九9| 丁香五月激情综合| 91久久久亚洲| 91麻豆天美国产欧美高潮| 激情自拍 校园春色| 一级日本牲交大片好爽在线看| 欧美日日人人天天| 九九热五区| 国产AV久久久蜜爱影集| www.色吧5.com| 国产一区二区在线看| 9热9热综合网| 九九Av| 日小BB小视频| 啊啊啊操死我| 欧美偷| 精品十三区| 超碰成人免费| 91人妻素女| 思思久热在线精品66| 免看60秒涩涩视频| 日小BB小视频| 97超碰美女| 五月天亚洲网| 欧美中字二区| 国模限制级电影| 亚洲精品日日夜夜52| 午夜操逼不卡| 国产品精品自在在线午夜免费| 久久亚州大香蕉| 密臀AV在线| 久久欧美1卡2卡3| 五月天激情四射| 郑州宾馆老熟女露脸啪啪| 思思热一热婷婷热一热| 欧美78| 久久久成人免费av电影| 亚洲色图亚洲无码强奸乱伦| 午夜精品久久一区二区| 高清无码学生妹高潮| 久久久专区| 久久女人视频| 亚洲欧美精品一区天堂久久 | 91麻豆天美国产欧美高潮| 日韩精品9999| 欧中日成人免费影视| 女优视频第10页| 五月婷婷丁香| 99精品久久久久久久婷婷蜜桃| 国产免a费看黄片在线| 人人弄人人摸| 亚洲AV成人精品网站在AV| 精品午夜福利| 久久久人妻| 欧美亚州综合网图片| 物业黑人 AV一区| 精品无码久久久久| 国产精品不卡一区二区三区| 男人的天堂欧美| 欧美熟妇精品黑人巨大一二三区| 老鸭窝亚洲毛片| 懂色AV一区二区三区| 狠狠操狠狠爱| 91 手机在线播放 绯色| 亚洲人精品久久久喷水| 久久大香蕉手机高清视频| 天堂蜜桃无码视频一区二区| 欧美极品女人的天堂| 日本有码久久| 人人澡人人爽人人精品| 日韩av三四区| 蜜臀久久在线视频| 动漫av中文| 久久久久无码一妻区| 精吧天堂| 亚春色色| 国产三级片在线观看| 最近二区三区视频大全| 亚洲欧美电影| 日韩欧洲操屄视频| 亚洲制服aⅴ中文字幕| 男人a天堂手机在线版| 人摸人人操人| 色99视频| 国产视频一区二区三区久久亚洲天堂| 人妻无码后入| 久草精品视频| 精品少妇一区二区| 青娱乐啪啪视频| 日韩无码极品| 乱伦一二三区| 一区二区三区免费岛国片| 91丨熟女丨丰满熟女| 91狠狠综合久久久| 激情综合网激情综合| 欧美性天天| 久久丁香久草综合网| 中文色综合| 中文字幕亚韩| 五月天激情小说网| 用力操死我| 国产乱人妻精品入口| 亚洲欧美综合网站| 变态综合色| 国产又粗又大硬免费色网视频| 日韩在线欧美精品一区二区| 欧美一级久久久久久久大片动画| WWW黄片COM| 日本 欧美 亚中文字幕| 色女综合| 久久久久幕乱码| 91亚州| 久久中文字幕不卡人妻| 国产操逼逼网| 亚洲另类久操网| 伊人青青草久久| 日本黄色精品| 亚洲,日韩,欧美,成人播放| 深田咏美亚洲精品福利社| 精品少妇后入一区二区三区四区人妻巨乳 | 久久日韩肥臀| 国产家庭乱伦性爱视频| 成人在线日韩| 成人欧美日超碰| 欧美天天弄| 亚洲精品影视老司机| 欧美视频在线第3页| 综合视频91| 亚洲加勒比| 天天日B夜夜干B时时操B| 手机av天堂久久久久| 99re6国产精品99re| 亚洲成人贴图| 日韩激情中文字幕有码| 人妻插插人妻人| 亚洲欧美激情小说| 亚洲国产91精品一区二区久久| 久久草大香蕉| 91欧美综合在线| 一级二级在线观看| 伊人婷婷五月天| 久久久久久久久久久久欧美日| 亚洲成a人v欧美综合天堂下载| 视频分类 国内精品| 午夜精品久久久久久久99热影院| 97超碰色色| 爱我干综合| 欧美在线中M| gogogo免费高清看中国国语| 玖玖97综合 | 97超碰中文在线| 超碰色97| 欧美成人黄网色网站| 极品内射| 成人午夜高潮av猛片| 九九九九久久久| 欧美后入式| 在线视频免费播放一区| 玖玖爱一区在线| aaa亚无码专区| 性欧美另类高清| 天天综合青苹果| 国产成人无码网站在线视频| 啊啊啊啊好大好硬啊啊啊啊啊| 久久日韩精品一区二区| 一区,二区,三区网站| 天天噜| 中文字幕 人妻不满 在线视频| 亚洲第一页综合在线| 国产九九九九九九九九| 色妇91| 欧美日韩国产黄色片| 大香蕉国产中文自拍| a亚洲欧美色欲| 久久超碰亚洲人| 色综合国产在线观看| 欧美 中文字幕 一区| 激情五月天中文字幕色| 天堂av2019| 国产高清自拍| 一个人在线看的黄色电影网站| 国产后入| 亚洲AV资源| 岛国在线国产| 粉嫩AV一区夜夜嗨| 国产成年免费大片黄在线观看| 亚洲色资源| 激情网色| 麻豆区久久久久亚| 色狠狠综合| 熟女91网站| 91精品电影18| 一级AV性爱| 老女人碰碰在线碰碰视频| 国产无马视频| 亚洲在线观看| 久久思思热| 日本淫乱女一区二区三区视频| 成年男人的天堂| 国产精品探花色| 超碰日韩美妻| 婷婷久热| 伊人天天久久动态图| 大香蕉99热| 黄色一区二区秘书性感| 夜夜嗨TV| 黄页大片在线观看| 国产一级特黄大片处女| 激情文学小说一区二区| 久操大香蕉手机视频在线看| 国产一区二区三区高清视频| 久久精品夜色国产亚洲AV| 国产亚洲日本精品在线| 97超碰欧美中文字幕| 超碰1024久久| 99热这里只有精品地址| 亚州一区二区| 欧美青青视频| 亚洲色五月| 呦呦影院| 中出91视频| 中文字幕在线观看第二页| 亚州操逼图| 97色在线视频| 91性感网站| 日本狠狠干| 久操com| 亚洲在线91| 久日91在线| 丁香激情五月天| 日韩无码三级影院| 久久精品超碰| 亚州综合图片| 狠狠中文字幕| 日本视频在线观看污污污| 国产97免费视频| 亚洲十八禁止| 禁止观看美女黄| 911粉嫩人妻| 蜜乳AV免费观看| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 丝袜制服字幕在线| 国产精品亚洲一区二区三区四区| 成年无码动漫av片无尽在线| 热热色国产一二区AV| 超碰97资源大奶| 亚洲精品视频在线| 色官网色综合| 日本爽爽爽爽爽爽免费视频| 亚洲欧美综合图片| 日韩丝袜高跟制服在线观看| 人人乐大香蕉| 日本污ww视频网站| 日韩久久.一级黄色片| 粉嫩av在线| 99久久久| 久久色AV线| 男人 天堂 日 亚洲| 天美传媒国产原创中文字幕亚洲欧美另类 | 成人av在线播放| 亚欧成人一级片在线播放| 亚洲清纯唯美| 神马久久久久久久久久久久| 长长久久曰曰夜夜成人网| 精品在线观看视频在线| 黄色人人| 欧美一级黄色免费专区| 色欧美综合| 成人三级片一区二区三区视频| 中文字幕文字幕无码一区二区三区电影99| 在线人妻熟女一区二区三区四区五区| 狠狠五月天| 国产精品熟女丝袜一区二区| 久久精品中文字幕观看| 日本熟女不卡视频| 精品人妻一区二区三区在| 97在线视频免费看| 日韩欧美久久婷婷网站| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 一本大道综合伊人精品热热| 密臀在线免费观看| www.97在线| 亚码激情| 欧美不卡在线美女| 日日狠狠久久偷偷色综合免费| 亚洲av强奸乱伦| 日本国产成人亚洲精品无码| 日韩国产成人自拍视频| 91c色| 333kkkk·亚洲com久久| 不卡一区二区日本视频| 国产成年免费大片黄在线观看| 免费中文综合精品| 免费成人在线观看91| 无码高清操逼| 伊人操你| 91人妻最真实刺激绿帽| 久久久久久一日韩字幕无码| 一级日本牲交大片好爽在线看| 性videos欧美熟妇hdx| jazzjazz国产精品麻豆| 在线毛片片免费观看| 亚洲国产精品成人综合| 亚洲精品一区二区精品| 一个国产在线综合网站| 日韩中文字幕视频| 被男人吃奶很爽的毛片| 亚洲成人黄色在线观看| 国内精品a| 操逼www.| 小情侣高清国产在线视频| 3p国产色噜噜一区| 五月丁香影视| 97青青操视频| 大香蕉在线免| 不卡一区视频| 韩国毛片一区二区三区| 欧美韩日精品99综合| 97免费视频在线| 国产又粗又大硬免费色网视频| 国产精品白丝在线播放 | 五月天婷婷综合| 爱爱60秒免费视频| 成人网欧美风情| 国产乱码久久久久久| 欧美亚洲韩国视频十五区| 欧色网址| 精品无码一区二区三区色欲| 欧美激情另类一区二区| 天天色播亚洲综合网站| 青草视频在线看看看看看看看看看| 91天天日| 很很很很操| 南澳成人一级片在线播放| 精品视频一区二区| 日本免费一级AAA大片器| 久久肏大逼| 天天操av懂色| 欧美综合 站| 人人操人人摸超碰| 永久免费av无码网站国产app | 99热这里都是精品| 久久伊人网视频一区二区三区| 欧美激情久| 日韩欧视频| 丰满美女一级毛片在线播放| 玖玖玖玖精品国产剧情| 69精品少妇一区二区三区蜜桃| 麻豆天美传媒在线视频天堂| 国产精品电| 欧美成人免费在线观看| 成人美女av| 青青草九九九九九| 亚州高清av| 国产一区二区二区按摩精品啪视频| 亚洲国产精品有声| 日本超碰在线国产一区| 婷婷五月天无码| 中文字幕乱亚洲美女精品一区| 色欲无码人妻日韩欧美精品| 婷婷五月成人| 日韩资源网| 国产福利合集| 日韩av影片在线观看| 青青操97| 婷婷人妻激情| www.伪伪| 国产欧美一区二区| 高潮9999外国| 中文字幕一区二区三区高清| 欧洲天天在线| 中文字幕欧洲有码| 九月激情婷婷| 偷拍欧美激情| 久久久涩| 伊人激情五月天一区二区| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 日韩人妻中文视频| 日欧美色| 中日韓欧美高清| WWW黄片COM| 欧美乱妇狂野欧美在线视频| 久久超碰网| 国产激情综合五月久久| 在线亚洲丝袜视频网站| 91AV入口| 翘臀vidoes| 九九热精品视频六| 亚洲成人美女无吗| 欲香欲色天天天综合和网| 亚洲丝袜诱惑| 色色婷| 高清孕妇孕交 交孕妇| 欧美性爱免费短视频| 欧美三级一级| 天天肏天天干| 亚洲人成网www| 伊人国产AV| 天天日天天干天天整| 日韩视频小说在线观看| 天天干天天舔| 夜夜爽妓女| 一起草高清无码| 美女黄色一级A视频| 欧美激情亚洲| 色色色色电影网| 乱色老一区二区三区的观看方式 | 视频一区二区免费在线| 天天狠| 日韩无限资源| 老女人爆菊| 七月婷婷综合| 偷拍 亚洲| 精品999999| 99国内精品| 久久久蜜桃臀无码视频| 天天影视色香色欲| 激情色图| 99999精品视频| 亚洲最新Av| 九九热五区| 国产AV色黄看到爽| 六月婷婷一区二区三区| 成人亚欧免费视频| 日本最新1区2区3区| 无码聚合| 超碰天天去日穴| 一级黄色影片| 一本久道久久综合狠狠爱一密臀精| 99色在线视频| 亚洲天堂男人天堂网| 欧美性猛交美女自慰91| 1769成人国产精品视频| 熟女一区二区| 日韩欧美大力操| 伊人色综合欧美| 国产超碰| 青青青青操国内视频在线| 97亚洲一区| 国产又黄又爽又刺激久久久久久| 欧美少妇性乱| 蜜桃无码AV一区二区| 花花AV导航| 国产夜夜艹| 国产99精品一区二区三区免费| 国产精品午夜福利视频| 全球成人中文在线| 97这里有精品| 九九天堂| 中文字幕一区二区三区字幕| 亚洲综合贴图91| 亚洲aV性爱| 亚洲图片91| 1024亚洲中文字幕久在线看片你懂的 | 一区=区三区视频| 男人天堂黄片| 好色美女九七第一页| 中文字幕在线观看丝袜| 亚洲无码com| 中文字幕久久亚州无码| 九九aV| 91天天综合| 国产美女激情| 亚洲AV无码成人精品久久| 日韩有码专区| 亚洲永久AV无码精品秋霞| 国产家庭乱伦网址| 中文字幕精品码亚洲| 91网亚洲| 91丨熟女丨丰满熟女| 九九草| 国产精品suv一区| 日本韩欧美在线播放a| 欧美色女人| 欧美性综合| 天天影视网综合少妇| 草草影院日本第一页| 欧美自拍网| 884t在线| 91操人| 国产欧美精选自拍一区| 欧美亚州综合网图片| 韩国三级三级BD在线| 色五月综合| 国产精品久久久久久久电影渣男| 97日韩欧美亚洲| 亚洲AV无码翔田千里网站| 天美久久久久| 欧美曰韩国产精品| 亚洲成人在线播放| 亚洲精品白浆高清久久久久久 | 免费看美国人人爽,人人操| 亚洲精品国产熟女久久久久久| 亚洲黄色AV电影| 老女人碰碰在线碰碰视频| 欧美日不卡| 亚洲综合中文字幕有码| 亚洲AV麻豆Aⅴ无码电影一| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 欧美狠狠弄| 97色色视频| 国产高清成人mv在线观看| 欧美激情久操网| 综合熟妇一区二区三区| 亚洲一本色码中文字幕| 啊啊啊啊一区| 色青青久久影视| 激情五月天插| 日本一级特级毛片视频| 亚洲欧美激情小说| 日韩资源网| 日本97久久久精品| 麻豆 欧美 日韩| 狠狠五月天| 国内自拍 日韩激情 99| 超97在线精品视频| 精品成人无码| 日韩免费中文字幕视频| 熟女人妻一区二区三区免费看 | 日本性爱网址| 国产av波波国产精品| 丝袜人妻av一区二区| 超碰在线一区二区三区| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 啊啊啊好湿国产一二| 天天天天操| 色色色999| 无码国产精品午夜不卡(| 激情综合网五月婷婷五月天| 大香蕉一区二区在线观看.| 国产高清成人免费视频| 欧美激情专区| 国产精品一区二区三区免费视频| 另类图片五月天| 久久久久96| av日韩中文字幕| 福利天天都操| 色噜噜狠狠色综无码久久| 99re在线视频| 亚洲诱惑天堂| 欧美中字不卡| 无卡一区=区| 人人妻天天做天天爽| 欧美日韩97在线| 亚州欧美综合| 2020中文字幕在线| 色综九九九一区| 久久久亚洲熟妇资源| 欧美日韩亚洲少妇寂寞影院正在播放| 无码九九九九| 性欧美| 国产精品丝袜在线| v91av| 97爱爱爱| 免费A片三p视频| 蜜臀久久久99久久久久 | 国产伦精品一区二区三区视频女| 九九内射在线| 999日韩中文精品观看视频。| 人妻天天操天天爽视频免费| 亚洲不卡不卡中文字幕不卡| 欧美午夜色妇色鬼| 日本啊啊啊啊啊视频| 国产少妇高潮| 天天在线91| 91性情| 囯产精品久久久久久久久久梁医生 | 天天躁日日躁AAA片李宗瑞| 久久久久国产无av| 夜夜操2028| 91暧暧| 亚洲网污污污污| 欧美综合网站999| 97在线免费看视频| 亚洲**2021在线观看| 狠狠中文字幕| 日本3级一区二区免费| 97精品国产97久久久久久| 宗合情欲网| 久久久精品中文字幕麻豆| 欧美日韩中文字幕不卡| 起碰97| 伊人久久大香线蕉无码| 91超碰人人操| 99热精品青草在线| 久久久久密臀视频| 9 1果冻精品视频| 高清有码一区二区| 欧美日韩 强奸乱伦| 99热这里都是精品| 中出789在线视频| 九九九久| 成人小说另类在线| 97视频在线观看免费高清| 水多多映视AV| 久操视频资源站公开| 日本熟妇一区二区三区| 丰满精品人妻少妇久久字幕| 91中文字幕在线观看| 国产偷人伦激情在线观看| 亚洲精品啪视频| 热久久91婷婷| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 国产精品一区二区亚洲人成毛片| blacked精品一区国产| 蜜桃久久综合视频| 久久熟女久| 美女91网站| 日韩成人大片一区二区| 五月久久HDAV| 99热线麻豆| heyZO天然素人无码AⅤ专区| 九九香蕉网| 久久久九九九九| site:sinbotex.com| 日本色色色色色视频| 九九九九九九九九九九九免费国产| 久久久成人精品| 啪啪视频免费在线观看| 天天干天天操天天干天天操| 日本不卡码黄色| 欧美色综合网| 操高情无码| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| 桑老女人九区| 一级性爱啪啪视频| 亚洲欧美一区二区三区在钱蜜桃| 伊人久久亚洲色欲综合网站 | 九九热九九热| 97在线播放| 这里只有精品视频在线观看麻豆| 欧美九九爱| 97亚洲综合在线| 黑人操一区二区| 午夜性| 神马久久久久久| 色一情一乱一乱一区91Av| A一级色女| 国产一区二区三区白丝| 小草三级久久观看| 亚洲天天自拍| 多乙久久久久久| 福利一级版子| 久久国产在线一区二区| 亚洲高潮少妇| 情色图区| 性爱乱伦一区| 久草精品一区| 亚洲一区日韩| 永久电影三级在线观看| 91久操| 中文字幕伊人| 岛国大片国产| 东北女人的毛片| 人人么人人操| 国产av高清版| 亚洲天天更新| www.色五月| 日本道人妻久久久在线不卡色视频| 国产精品一级毛片不卡视| 亚洲国产精品久久久男人的天堂| 色吧5亚洲| 国产suv精品一区二区四| 超碰地址久久| 中文字幕精品一区二区精品| 夜夜嗨一区二区三区直播内容| 色小视频蜜乳|