日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

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

WPF仿Word富文本編輯器:FlowDocument架構(gòu)與核心實(shí)現(xiàn)

WPF仿Word富文本編輯器:FlowDocument架構(gòu)與核心實(shí)現(xiàn) 簡(jiǎn)介面向WPF桌面應(yīng)用開發(fā)者的仿Word富文本編輯器開源示例適合希望在自己項(xiàng)目中實(shí)現(xiàn)格式化文本編輯、圖文混排與表格處理的中級(jí)開發(fā)者參考。項(xiàng)目拆分為富文本編輯核心組件與演示主程序并提供完整解決方案功能覆蓋基礎(chǔ)文本編輯、查找替換、HTML源碼查看、打印、導(dǎo)出純文本、插入圖片與表格便于理解編輯器界面與業(yè)務(wù)邏輯的分層組織。rar壓縮包共289個(gè)文件約753KB包含76個(gè)cs源碼、若干xaml與baml界面資源、gif/png圖片素材、dll與pdb程序集及配置文檔等其中cs源碼承載編輯核心邏輯xaml與baml對(duì)應(yīng)界面布局體量輕便卻保留較完整的工程結(jié)構(gòu)。已有2875人學(xué)習(xí)下載可據(jù)此研究WPF圖形模型下的復(fù)雜編輯操作、文本與圖像數(shù)據(jù)處理及.NET組件交互并在現(xiàn)有代碼上擴(kuò)展格式化選項(xiàng)或文件格式支持。1. 從「能輸入」到「能交付」一個(gè)仿 Word 的 WPF 富文本編輯器要跨過(guò)幾道坎很多人對(duì) WPF 富文本編輯器的第一印象是把 RichTextBox 拖進(jìn)窗口、綁上按鈕就完事。真做過(guò)一個(gè)仿 Word 的完整 demo 才知道「能輸入」和「能交付」之間隔著文檔模型、命令棧、分頁(yè)排版和一整層 Ribbon 界面。開源代碼 demo 的意義就在這它把一條已經(jīng)跑通的路先鋪好讓你看清每個(gè)模塊該放在哪、邊界劃在哪而不是從零開始一邊試錯(cuò)一邊猜。這套方案適合兩類讀者——畢設(shè)或課設(shè)要做桌面文檔編輯器的學(xué)生以及需要在產(chǎn)品里嵌一個(gè)輕量排版控件、又不想引入重型商業(yè)組件的開發(fā)者。2. 總體架構(gòu)設(shè)計(jì)以 FlowDocument 為唯一事實(shí)來(lái)源的六層結(jié)構(gòu)架構(gòu)這件事我一般不會(huì)一上來(lái)就畫框。先想清楚「誰(shuí)是唯一事實(shí)來(lái)源」后面的分層才有意義。在這個(gè)編輯器里答案是 FlowDocument光標(biāo)、選區(qū)、格式、表格、圖片全部掛在它上面界面上任何一次點(diǎn)擊最終都要落到這棵樹上。定下這條剩下的事情就變成「誰(shuí)能改它、怎么改、改完怎么存」。2.1 三條技術(shù)路線對(duì)比原生 RichTextBox、自繪排版、第三方控件WPF 做富文本繞不開三條路。第一條是原生路線RichTextBox 套 FlowDocument。好處是編輯器內(nèi)核、光標(biāo)移動(dòng)、拼寫檢查、無(wú)障礙支持全部白送你只需要補(bǔ)分頁(yè)、補(bǔ)導(dǎo)出、補(bǔ)界面。壞處也明顯FlowDocument 是流式模型天生不擅長(zhǎng)固定頁(yè)排版導(dǎo)出 docx 需要自己寫映射上萬(wàn)段的長(zhǎng)文檔會(huì)明顯掉幀。第二條是自繪路線RichTextBox 只當(dāng)輸入法宿主文檔模型、排版、命中測(cè)試全部自己寫。這條路能做出完全可控的分頁(yè)和打印但對(duì)團(tuán)隊(duì)要求很高斷行算法、雙向文本、表格自動(dòng)布局每一項(xiàng)都是幾周的活。課程設(shè)計(jì)周期里基本走不完。第三條是引入商業(yè)控件。功能齊全但源碼不可見遇到「導(dǎo)出 docx 后表格邊框丟一半」這種問(wèn)題只能等廠商排期和「開源代碼 demo」的定位也不搭。三條路的對(duì)比大致是這樣維度原生 RichTextBox自繪排版引擎商業(yè)控件起步成本低一天能出原型高兩周起步中接入 授權(quán)固定頁(yè)分頁(yè)需自己封裝 Paginator完全可控通常內(nèi)置docx 保真度中等需寫映射取決于實(shí)現(xiàn)深度高大文檔性能萬(wàn)段級(jí)開始吃力可做到很好視產(chǎn)品而定可定制性高源碼在手最高低這個(gè) demo 走的是第一條路把 FlowDocument 當(dāng)成唯一事實(shí)來(lái)源所有擴(kuò)展圍繞它做。選型的判斷依據(jù)很樸素交付周期內(nèi)能不能把「表格 圖片 分頁(yè) 導(dǎo)出」四件事同時(shí)做扎實(shí)。原生的底子已經(jīng)解決了其中一半剩下的一半是可以靠封裝補(bǔ)上的自繪則是把已經(jīng)解決的那一半推倒重來(lái)。2.2 六層的職責(zé)劃分與依賴方向分層的關(guān)鍵不是層數(shù)多而是依賴方向單一。這個(gè)編輯器分成六層上層依賴下層反向一律通過(guò)接口或事件回調(diào)層職責(zé)關(guān)鍵類型文檔層承載唯一可信的文檔樹FlowDocument / Paragraph / Table編輯服務(wù)層所有修改以命令形式進(jìn)入IEditorCommand / UndoStack視圖層渲染、光標(biāo)、選區(qū)、分頁(yè)RichTextBox / DocumentPaginator界面層Ribbon、狀態(tài)欄、對(duì)話框RibbonTab / RoutedUICommand持久化層打開與保存各類格式DocumentIO / OpenXmlMapper擴(kuò)展層表格、圖片、查找替換、字?jǐn)?shù)統(tǒng)計(jì)IEditorPlugin一個(gè)容易翻車的地方是編輯服務(wù)層和界面層的邊界。如果 Ribbon 上的「加粗」按鈕直接去改TextElement.FontWeightProperty撤銷棧就永遠(yuǎn)記不到這一步用戶按 CtrlZ 會(huì)發(fā)現(xiàn)格式只回退一半。約定是界面層只發(fā)命令不碰文檔。Ribbon 按鈕把RoutedCommand拋出去由編輯服務(wù)層接收、執(zhí)行、入棧視圖層只負(fù)責(zé)把執(zhí)行結(jié)果畫出來(lái)。這條約定寫在代碼注釋里比寫在設(shè)計(jì)文檔里有用得多。擴(kuò)展層用插件接口收口是為了讓「查找替換」「字?jǐn)?shù)統(tǒng)計(jì)」這類功能不往主窗口里堆。每個(gè)插件實(shí)現(xiàn)三個(gè)方法初始化時(shí)掛菜單、文檔變更時(shí)刷新狀態(tài)、卸載時(shí)清理事件訂閱。少了第三條窗口關(guān)不掉、內(nèi)存不釋放這類問(wèn)題會(huì)一直留著。public interface IEditorPlugin { string Name { get; } // host 暴露當(dāng)前文檔、命令總線和狀態(tài)欄插件只能通過(guò)這些入口操作 void Attach(IEditorHost host); void Detach(); } public interface IEditorHost { FlowDocument Document { get; } void Execute(IEditorCommand command); // 唯一允許修改文檔的入口 void SetStatus(string text); // 狀態(tài)欄提示避免插件直接抓控件 }Attach里掛事件、Detach里退訂是這個(gè)接口能成立的前提。我一般會(huì)要求插件在Detach之后不再持有任何TextPointer——TextPointer 會(huì)拖住整棵文檔樹一個(gè)泄漏就能讓幾十兆的內(nèi)存常駐。2.3 文檔模型拆解FlowDocument 的塊級(jí)與行內(nèi)結(jié)構(gòu)FlowDocument 是一棵樹塊級(jí)元素Block和行內(nèi)元素Inline兩套體系。塊級(jí)負(fù)責(zé)段落級(jí)結(jié)構(gòu)Paragraph、Table、List、Section、BlockUIContainer行內(nèi)負(fù)責(zé)字符級(jí)結(jié)構(gòu)Run、Span、Bold、Italic、Hyperlink、InlineUIContainer、LineBreak。FlowDocument xmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentation Paragraph FontSize16 FontWeightBold文檔標(biāo)題/Paragraph Paragraph 正文第一段其中 Bold加粗片段/Bold 與 Span ForegroundGray灰色說(shuō)明/Span 可以混排。 /Paragraph List MarkerStyleDecimal ListItemParagraph列表項(xiàng)一/Paragraph/ListItem ListItemParagraph列表項(xiàng)二/Paragraph/ListItem /List Table CellSpacing0 TableRowGroup TableRowTableCellParagraph表頭/Paragraph/TableCell/TableRow /TableRowGroup /Table /FlowDocument理解這棵樹的關(guān)鍵是兩點(diǎn)。第一格式是屬性不是節(jié)點(diǎn)。Bold之所以存在只是Span上FontWeight的一個(gè)語(yǔ)法糖你寫run.FontWeight FontWeights.Bold和用Bold包裹最終樹結(jié)構(gòu)是一樣的。第二屬性有繼承。段落上的FontSize會(huì)被下面的Run繼承除非Run自己設(shè)了本地值。這解釋了一個(gè)高頻疑問(wèn)為什么代碼里讀到的字號(hào)和用戶設(shè)的不一樣——GetValue拿到的是本地值TextRange.GetPropertyValue拿到的才是繼承后的有效值。遍歷時(shí)我一般用LogicalTreeHelper.GetChildren遞歸而不是遍歷Blocks集合本身因?yàn)镾ection和Table會(huì)嵌出多層只看一層會(huì)漏掉嵌套內(nèi)容。遍歷結(jié)果通常用來(lái)做字?jǐn)?shù)統(tǒng)計(jì)、全文替換和目錄生成這三件事的共同點(diǎn)是都需要對(duì)整棵樹做一次線性掃描。3. 核心編輯能力實(shí)現(xiàn)序列化、光標(biāo)、撤銷棧與表格圖片架構(gòu)定完落地就是四件事文檔怎么存、光標(biāo)怎么定位、改錯(cuò)了怎么退、復(fù)雜元素怎么插。這四件事做不扎實(shí)界面做得再像 Word 也只是個(gè)空殼。3.1 打開與保存XamlPackage、RTF 與 docx 的取舍WPF 提供了TextRange.Save/Load這個(gè)便捷入口但格式選擇上有坑。DataFormats.Xaml只保存 XAML 文本圖片以 URI 引用的形式存在文件一挪位置就變紅叉DataFormats.XamlPackage是 ZIP 容器把圖片等資源一起打包進(jìn)去這才是本地存檔該用的格式。public enum DocFormat { XamlPackage, Rtf, Text } public static class DocumentIO { public static void Save(FlowDocument doc, string path, DocFormat format) { using FileStream fs File.Create(path); TextRange range new TextRange(doc.ContentStart, doc.ContentEnd); DataFormat fmt format switch { DocFormat.XamlPackage DataFormats.XamlPackage, // 圖片隨包走推薦存檔 DocFormat.Rtf DataFormats.Rtf, // 便于和外部工具交換 DocFormat.Text DataFormats.Text, // 只留純文本用于預(yù)覽 _ throw new ArgumentOutOfRangeException(nameof(format)) }; range.Save(fs, fmt); } public static FlowDocument Load(string path, DocFormat format) { FlowDocument doc new FlowDocument(); using FileStream fs File.OpenRead(path); TextRange range new TextRange(doc.ContentStart, doc.ContentEnd); DataFormat fmt format DocFormat.XamlPackage ? DataFormats.XamlPackage : DataFormats.Rtf; range.Load(fs, fmt); doc.UndoCapacity 100; // 默認(rèn) 100 步夠用長(zhǎng)文檔可調(diào)到 200 return doc; } }TextRange的兩個(gè)參數(shù)是起點(diǎn)和終點(diǎn)取doc.ContentStart到doc.ContentEnd表示整篇。UndoCapacity是 RichTextBox 自帶撤銷棧的深度默認(rèn)值對(duì)短文檔夠用對(duì)動(dòng)輒幾十頁(yè)的文檔偏小編輯到中段就開始「按到某一步退不回去了」調(diào)大一些能緩解。docx 則沒(méi)有內(nèi)建通道。可行的做法是引入 OpenXML SDK寫一層OpenXmlMapper把WordprocessingDocument里的Paragraph、Table、Run逐節(jié)點(diǎn)映射成 FlowDocument 的對(duì)應(yīng)節(jié)點(diǎn)反向再寫一遍導(dǎo)出。映射過(guò)程中最耗時(shí)的不是文本是樣式字號(hào)要除以 2半磅轉(zhuǎn)磅、顏色要從 hex 轉(zhuǎn)SolidColorBrush、表格邊框要按邊的方向分別取BorderThickness。demo 里通常只覆蓋常用子集——標(biāo)題、正文、加粗斜體、表格、圖片——把「打開不崩、導(dǎo)出能看」作為及格線剩下的慢慢補(bǔ)。3.2 光標(biāo)與選區(qū)TextPointer 的定位與屬性讀寫TextPointer 是這套體系里最容易被低估的類型。它不是索引是「兩個(gè)字符之間的位置」帶一個(gè)LogicalDirection表示朝前還是朝后。這一句話沒(méi)理解透后面全是玄學(xué)。// 取光標(biāo)所在段落并讀取其有效對(duì)齊方式 TextPointer caret editor.CaretPosition; Paragraph? para caret.Paragraph; // 光標(biāo)不在段落里時(shí)為 null if (para is not null) { // GetValue 拿本地值TextRange.GetPropertyValue 拿繼承后的有效值 var range new TextRange(para.ContentStart, para.ContentEnd); object effective range.GetPropertyValue(Paragraph.TextAlignmentProperty); TextAlignment align (TextAlignment)effective; } // 選區(qū)兩端可能方向相反取 Start/End 更穩(wěn)妥 TextSelection sel editor.Selection; if (!sel.IsEmpty) { TextPointer from sel.Start; // 已按文檔順序歸一化 TextPointer to sel.End; int length from.GetOffsetToPosition(to); }三個(gè)參數(shù)值得單獨(dú)說(shuō)。caret.Paragraph是向上找最近的Paragraph祖先光標(biāo)落在表格單元格或圖片容器里時(shí)返回的是所在段落不是 null這點(diǎn)和直覺(jué)一致。GetOffsetToPosition返回的是符號(hào)偏移量一個(gè)漢字算一個(gè)符號(hào)但一個(gè)\r\n在 FlowDocument 里算兩個(gè)所以字?jǐn)?shù)統(tǒng)計(jì)不能直接拿它當(dāng)年字?jǐn)?shù)用需要遍歷Run累加Text.Length。sel.Start/End已經(jīng)按文檔順序歸一化而AnchorPosition/FocusPosition保留用戶拖選方向做格式刷時(shí)前者夠用做選區(qū)擴(kuò)展時(shí)要用后者。還有一個(gè)小細(xì)節(jié)TextPointer會(huì)隨文檔變更失效。保存快照式的選區(qū)比如「記住上次編輯位置」必須在每次文檔變更后重新解析一遍否則下次跳轉(zhuǎn)就跳到別處去了。3.3 撤銷重做命令模式怎么和 RichTextBox 自帶棧共存RichTextBox 本身有撤銷為什么還要自己做一套因?yàn)樗徽J(rèn)自己視圖內(nèi)部的操作。你在 Ribbon 上插入一個(gè)表格、批量替換了二十處文字、用代碼改了一批段落的行距這些都不在它的棧里。用戶按 CtrlZ格式退回去了表格還在——這就是典型的撤銷斷層。public interface IEditorCommand { string Name { get; } void Execute(); void Undo(); } public sealed class UndoStack { private readonly StackIEditorCommand _undo new(); private readonly StackIEditorCommand _redo new(); private const int MaxDepth 100; public void Push(IEditorCommand cmd) { cmd.Execute(); _undo.Push(cmd); _redo.Clear(); // 新操作讓重做鏈?zhǔn)н@一步最常被漏掉 if (_undo.Count MaxDepth) TrimOldest(); } public void Undo() { if (_undo.Count 0) return; IEditorCommand cmd _undo.Pop(); cmd.Undo(); _redo.Push(cmd); } public void Redo() { if (_redo.Count 0) return; IEditorCommand cmd _redo.Pop(); cmd.Execute(); _undo.Push(cmd); } private void TrimOldest() { /* 棧底淘汰保持深度上限 */ } }Execute和Undo必須嚴(yán)格互逆這是命令模式能用的唯一前提。實(shí)現(xiàn)上有個(gè)務(wù)實(shí)的選擇與其為每個(gè)操作寫精細(xì)的逆操作不如在命令里存一份「操作前的選區(qū)文本 格式」快照撤銷時(shí)用快照覆蓋回去??煺盏拇鷥r(jià)是內(nèi)存一個(gè) 300 字的段落快照不到 1 KB100 步也就幾百 KB換來(lái)的是不會(huì)出現(xiàn)「撤銷到一半文檔結(jié)構(gòu)錯(cuò)亂」這種噩夢(mèng)。另一件必須做的是合并。用戶連點(diǎn)十次加粗不應(yīng)該產(chǎn)生十條命令。常見做法是給命令加一個(gè)合并鍵操作類型 目標(biāo)范圍新命令入棧前和棧頂比對(duì)鍵相同就替換而不是追加再把一個(gè) 500ms 的時(shí)間窗作為額外條件超時(shí)就不合并。3.4 表格與圖片BlockUIContainer 與 Table 的插入邏輯表格是仿 Word 的必備項(xiàng)也是最容易做出「看起來(lái)能行、用起來(lái)全是洞」的模塊。public static Table BuildTable(int rows, int cols) { Table table new Table { CellSpacing 0, Margin new Thickness(0, 8, 0, 8) }; for (int c 0; c cols; c) table.Columns.Add(new TableColumn()); // 列寬留空交給自動(dòng)布局 TableRowGroup group new TableRowGroup(); table.RowGroups.Add(group); for (int r 0; r rows; r) { TableRow row new TableRow(); for (int c 0; c cols; c) { TableCell cell new TableCell(new Paragraph(new Run(string.Empty))) { BorderBrush Brushes.Gray, BorderThickness new Thickness(0.5), Padding new Thickness(4) }; row.Cells.Add(cell); } if (r 0) row.Background Brushes.LightGray; // 首行當(dāng)表頭 group.Rows.Add(row); } return table; }Columns里加空的TableColumn是必須的數(shù)量決定列數(shù)寬度留空才會(huì)自動(dòng)均分只往Cells里塞內(nèi)容而不加TableColumn渲染出來(lái)的列寬會(huì)塌成一條。CellSpacing 0關(guān)掉單元格間隙否則邊框是雙線和 Word 默認(rèn)樣式差很遠(yuǎn)。表頭底色放在TableRow.Background上而不是TableCell上導(dǎo)出時(shí)才能被識(shí)別成表頭行。圖片分兩種。整段獨(dú)占的圖走BlockUIContainer行內(nèi)小圖標(biāo)走InlineUIContainerBitmapImage bmp new BitmapImage(); bmp.BeginInit(); bmp.UriSource new Uri(imagePath, UriKind.Absolute); bmp.CacheOption BitmapCacheOption.OnLoad; // 立即讀進(jìn)內(nèi)存不長(zhǎng)期占用文件句柄 bmp.EndInit(); bmp.Freeze(); // 凍結(jié)后才能跨線程使用、參與打印 Image img new Image { Source bmp, Stretch Stretch.Uniform, MaxWidth 480 }; document.Blocks.Add(new BlockUIContainer(img));CacheOption.OnLoad和Freeze()這兩行不是可選項(xiàng)。不設(shè)OnLoad用戶刪掉原圖文件后文檔里的圖就沒(méi)了不Freeze打印或?qū)С龅胶笈_(tái)線程時(shí)直接拋異常。MaxWidth限制在正文寬度以內(nèi)否則一張 4000 像素的照片會(huì)把整頁(yè)撐爆。4. 仿 Word 界面層實(shí)現(xiàn)Ribbon、分頁(yè)視圖與格式刷界面層的目標(biāo)不是好看是「用戶不用學(xué)」。Word 用戶對(duì)功能區(qū)的位置有肌肉記憶字號(hào)在最左邊、加粗在旁邊、對(duì)齊方式在下一組照著排就對(duì)了。4.1 Ribbon 工具欄與 RoutedCommand 的綁定方式WPF 自帶EditingCommands加粗、斜體、下劃線、對(duì)齊、縮進(jìn)全都有現(xiàn)成的RoutedCommand前提是把CommandTarget指向編輯器。Ribbon x:NameMainRibbon AutomationProperties.Name主功能區(qū) RibbonTab Header開始 RibbonGroup Header字體 RibbonComboBox x:NameFontFamilyBox IsEditableTrue Width140 SelectionChangedOnFontFamilyChanged/ RibbonComboBox x:NameFontSizeBox IsEditableTrue Width70/ RibbonButton Label加粗 SmallImageSource/Icons/bold.png CommandEditingCommands.ToggleBold CommandTarget{Binding ElementNameEditor} FocusableFalse/ RibbonButton Label傾斜 SmallImageSource/Icons/italic.png CommandEditingCommands.ToggleItalic CommandTarget{Binding ElementNameEditor} FocusableFalse/ /RibbonGroup RibbonGroup Header段落 RibbonToggleButton Label左對(duì)齊 CommandEditingCommands.AlignLeft CommandTarget{Binding ElementNameEditor} FocusableFalse/ RibbonToggleButton Label居中 CommandEditingCommands.AlignCenter CommandTarget{Binding ElementNameEditor} FocusableFalse/ /RibbonGroup /RibbonTab /RibbonCommandTarget是這套綁定的命門。EditingCommands是路由命令不指定目標(biāo)就會(huì)沿著可視樹往上冒泡冒到 Ribbon 就斷了按鈕永遠(yuǎn)是灰的。FocusableFalse同樣關(guān)鍵——按鈕一旦能拿焦點(diǎn)點(diǎn)下去編輯器就失焦選區(qū)消失加粗作用在一個(gè)空選區(qū)上用戶看到的現(xiàn)象就是「點(diǎn)了沒(méi)反應(yīng)」。CanExecute也要接管。表格里選中整行時(shí)「項(xiàng)目符號(hào)」應(yīng)該禁用光標(biāo)在只讀區(qū)域時(shí)所有編輯命令都應(yīng)該變灰。做法是在CommandBinding的CanExecute里讀一次當(dāng)前上下文把判斷集中在一個(gè)方法里別散落到十幾個(gè)事件處理器里。4.2 分頁(yè)視圖與標(biāo)尺把流式文檔切成 A4 頁(yè)FlowDocument 是流式的天生沒(méi)有「頁(yè)」的概念。要做出 Word 那樣的分頁(yè)效果走DocumentPaginatorpublic static DocumentPaginator CreateAPaginator(FlowDocument doc) { // 96 DPI 下A4 210mm x 297mm ≈ 794 x 1123 設(shè)備無(wú)關(guān)像素 doc.PageWidth 794; doc.PageHeight 1123; doc.PagePadding new Thickness(72); // 1 英寸頁(yè)邊距對(duì)齊 Word 默認(rèn)值 doc.ColumnWidth double.PositiveInfinity; // 單欄防止自動(dòng)分欄 return ((IDocumentPaginatorSource)doc).DocumentPaginator; }三個(gè)參數(shù)的含義要說(shuō)清。PageWidth/PageHeight用的是設(shè)備無(wú)關(guān)像素?fù)Q算基準(zhǔn)是 96 DPI所以 A4 是 794×1123 而不是 210×297。PagePadding是內(nèi)容區(qū)到紙邊的距離設(shè)成 72 就對(duì)應(yīng) 1 英寸和 Word 中文檔默認(rèn)頁(yè)邊距一致這樣導(dǎo)出后兩邊對(duì)得上。ColumnWidth設(shè)成PositiveInfinity是為了強(qiáng)制單欄——FlowDocument 在頁(yè)面夠?qū)挄r(shí)會(huì)自動(dòng)分欄屏幕上看著挺整齊打印出來(lái)就變成報(bào)紙排版。標(biāo)尺的實(shí)現(xiàn)思路是反過(guò)來(lái)的不畫紙畫內(nèi)容區(qū)。橫向標(biāo)尺對(duì)應(yīng)PagePadding.Left到PageWidth - PagePadding.Right這一段刻度按厘米換算1 厘米約等于 37.8 設(shè)備無(wú)關(guān)像素。縮進(jìn)標(biāo)記用Paragraph.Margin和TextIndent驅(qū)動(dòng)拖動(dòng)時(shí)直接改屬性改完再讓DocumentPaginator重新分頁(yè)。分頁(yè)視圖本身有兩種做法FlowDocumentPageViewer省事但不可控DocumentPageView配合自定義的翻頁(yè)容器靈活但要多寫幾十行。demo 里通常選后者因?yàn)橐幚怼疙?yè)面縮放」「雙頁(yè)并排」「頁(yè)間陰影」這些 Word 用戶期待的效果。4.3 格式刷與樣式聯(lián)動(dòng)屬性快照的正確抓法格式刷看著簡(jiǎn)單實(shí)現(xiàn)上有個(gè)容易忽略的點(diǎn)抓的是有效值不是本地值。private static readonly DependencyProperty[] CharProps { TextElement.FontFamilyProperty, TextElement.FontSizeProperty, TextElement.FontWeightProperty, TextElement.FontStyleProperty, TextElement.ForegroundProperty, TextElement.BackgroundProperty }; private DictionaryDependencyProperty, object? _snapshot; public void CaptureFormat(TextRange source) { // GetPropertyValue 返回繼承后的有效值比 GetValue 更貼近用戶看到的樣式 _snapshot CharProps.ToDictionary(p p, p source.GetPropertyValue(p)); } public void ApplyFormat(TextRange target) { if (_snapshot is null) return; foreach (KeyValuePairDependencyProperty, object kv in _snapshot) target.ApplyPropertyValue(kv.Key, kv.Value); }GetPropertyValue和GetValue的差別就在繼承上。用戶在段落上設(shè)了 14 號(hào)字光標(biāo)選中的Run本身沒(méi)有本地字號(hào)GetValue返回NaNGetPropertyValue返回 14。格式刷要復(fù)制的是「看起來(lái)的樣子」所以必須用后者。ApplyPropertyValue也有代價(jià)它會(huì)給選區(qū)內(nèi)每個(gè)元素打上本地值選區(qū)一長(zhǎng)元素的屬性表就膨脹撤銷棧也跟著漲。所以格式刷只作用在非空選區(qū)上且對(duì)超過(guò)一定長(zhǎng)度的選區(qū)給出提示別讓用戶一把刷完整篇。樣式聯(lián)動(dòng)是另一層。標(biāo)題 1、標(biāo)題 2、正文這些樣式應(yīng)該存成Style資源Ribbon 上的下拉框切換的是Paragraph.Style而不是逐個(gè)屬性去改。這樣改一次樣式定義全篇同類段落一起變才是 Word 的用法。5. 避坑與排查五類上線后才暴露的問(wèn)題自測(cè)階段一切正常、交付后問(wèn)題接踵而來(lái)是這類項(xiàng)目最常見的劇本。下面五條是踩過(guò)之后印象最深的按「現(xiàn)象 → 原因 → 解決」寫清楚遇到同類問(wèn)題可以直接對(duì)照。5.1 渲染與持久化類圖片丟失、打印走樣、粘貼卡頓保存后圖片全變紅叉?,F(xiàn)象是文檔里圖片顯示正常關(guān)掉重開后全變成破圖占位符。原因多半是用了DataFormats.Xaml保存——這個(gè)格式存的是 XAML 文本圖片只留一個(gè)指向臨時(shí)目錄的 URI臨時(shí)目錄一清理就失效。解決是改用DataFormats.XamlPackage它是 ZIP 容器會(huì)把圖片字節(jié)一起打進(jìn)去如果出于兼容性必須用純 XAML就得自己維護(hù)一個(gè)資源字典把圖片 base64 內(nèi)嵌進(jìn) XAML 并用BitmapImage.StreamSource還原。打印出來(lái)的版式和屏幕上對(duì)不上行尾被切掉半行。現(xiàn)象是預(yù)覽時(shí)好好的打出來(lái)右邊少一截或者頁(yè)腳文字被截?cái)?。原因通常是屏幕排版?96 DPI 算、打印機(jī)按物理尺寸算兩套坐標(biāo)系沒(méi)對(duì)齊再疊加PagePadding和PrintTicket頁(yè)邊距雙重扣減。解決是打印前用獨(dú)立的DocumentPaginator重新分頁(yè)把PageWidth/PageHeight設(shè)成紙張實(shí)際尺寸、PagePadding設(shè)成 0頁(yè)邊距只在PrintTicket里設(shè)一次屏幕預(yù)覽和打印走同一段分頁(yè)代碼別各寫一套。從 Word 粘貼一段帶格式的文字界面卡五秒以上。現(xiàn)象是 CtrlV 之后整個(gè)窗口假死任務(wù)管理器里 CPU 拉滿。原因是剪貼板里帶過(guò)來(lái)的是完整的 HTML 或 RTF段落數(shù)量多、內(nèi)聯(lián)樣式多、還夾著內(nèi)嵌圖片逐段ApplyPropertyValue會(huì)觸發(fā)成百上千次布局重算。解決是先把剪貼板內(nèi)容Load到一個(gè)離屏的臨時(shí) FlowDocument在離屏文檔里做清洗去掉不認(rèn)識(shí)的樣式、壓縮連續(xù)空格、把圖片轉(zhuǎn)成BlockUIContainer清洗完再一次性合并進(jìn)主文檔內(nèi)容超過(guò)一定規(guī)模時(shí)用Dispatcher分批插入并給出進(jìn)度。5.2 交互與狀態(tài)類撤銷斷層、點(diǎn)工具欄選區(qū)消失按 CtrlZ 只能退一半格式回去了但表格還在。現(xiàn)象是用戶插了一個(gè)表格又改了字號(hào)撤銷一次字號(hào)變回去再按一次什么也不發(fā)生。原因是表格插入走的是自定義代碼路徑?jīng)]進(jìn)UndoStack只進(jìn)了 RichTextBox 自帶的棧而字號(hào)修改走的又是另一條路徑。解決是把「所有修改文檔的操作」統(tǒng)一收口到IEditorHost.Execute界面層不允許直接碰FlowDocumentRichTextBox 自帶的IsUndoEnabled關(guān)掉撤銷入口只保留一個(gè)。收口之后新加功能只要忘了走命令總線撤銷就會(huì)明顯不對(duì)反而容易發(fā)現(xiàn)。點(diǎn)了 Ribbon 上的加粗選區(qū)沒(méi)了字也沒(méi)變粗。現(xiàn)象是選中一段文字鼠標(biāo)移到工具欄點(diǎn)一下選區(qū)高亮消失操作無(wú)效。原因是按鈕搶走了鍵盤焦點(diǎn)RichTextBox 失焦后選區(qū)被清空命令作用在一個(gè)空位置上。解決是給所有工具欄按鈕加FocusableFalse同時(shí)在PreviewMouseDown里保存一次Selection.Start/End快照命令執(zhí)行前用快照恢復(fù)選區(qū)。這兩步做完還要檢查RibbonComboBox這類可編輯控件——它必須能拿焦點(diǎn)那就得在DropDownOpened時(shí)存快照、DropDownClosed時(shí)恢復(fù)。6. 驗(yàn)收與答辯一份 20 分鐘能跑完的檢查表到了答辯或交付環(huán)節(jié)最怕的不是功能少是演示到一半翻車。我在驗(yàn)收時(shí)固定跑一張表按順序走一遍任何一項(xiàng)不過(guò)就先修再演示檢查項(xiàng)操作判定標(biāo)準(zhǔn)文檔打開打開一份含標(biāo)題、列表、表格、圖片的存檔無(wú)異常彈窗圖片正常顯示格式往返加粗、斜體、字號(hào)、顏色各設(shè)一次后保存再打開四項(xiàng)格式完全保留表格編輯插入 5×4 表格跨單元格選中后合并結(jié)構(gòu)正確邊框不斷線撤銷深度連續(xù)做 20 次不同操作按 20 次 CtrlZ回到初始狀態(tài)無(wú)殘影分頁(yè)一致性切到分頁(yè)視圖翻到最后一頁(yè)頁(yè)數(shù)與狀態(tài)欄顯示一致打印預(yù)覽打開打印預(yù)覽行尾不截?cái)囗?yè)邊距與屏幕一致粘貼壓力從外部粘貼一份 3000 字帶格式文本3 秒內(nèi)完成界面不假死長(zhǎng)文檔連續(xù)插入 200 個(gè)段落滾動(dòng)流暢輸入無(wú)明顯延遲答辯時(shí)的講述順序也有講究。別從技術(shù)棧開始講從「一個(gè)具體的使用場(chǎng)景」切進(jìn)去打開一份帶表格的文檔、改兩處格式、撤銷、導(dǎo)出、打印預(yù)覽五個(gè)動(dòng)作兩分鐘走完評(píng)委立刻知道這東西能干什么。然后再回頭講分層、講為什么選 FlowDocument、講撤銷棧為什么要自己維護(hù)——這時(shí)候技術(shù)細(xì)節(jié)才有落點(diǎn)。被問(wèn)到「你這個(gè)和 Word 差在哪」誠(chéng)實(shí)回答差在協(xié)同編輯、差在復(fù)雜域、差在排版引擎的精度但輕量嵌入、源碼可控、二次開發(fā)成本低這三條是它的位置。有個(gè)血淚教訓(xùn)值得說(shuō)早些年我做類似的項(xiàng)目驗(yàn)收前一周才發(fā)現(xiàn)「保存后重新打開表格邊框丟了一半」追下去是導(dǎo)出映射里只處理了外邊框沒(méi)處理內(nèi)邊框。從那以后我每次動(dòng)持久化層都強(qiáng)制走一遍「改格式 → 保存 → 關(guān)程序 → 重開 → 逐項(xiàng)比對(duì)」這條鏈路哪怕只改了一行代碼。這份 demo 的工程結(jié)構(gòu)和上面的分層是一一對(duì)應(yīng)的把它當(dāng)參照物對(duì)照著自己的實(shí)現(xiàn)走一遍能省下不少返工。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
青草伊人久久| 91精品人妻一区二区三区蜜桃| 丁香7月婷婷| 欧洲综合色| 日韩一级久久毛片| 另类专区在线观看| 欧亚日韩综合精品国产| 精品91摸| 91丝袜在线播放| 乱欲一区二区| 美女91在线观看| 久久久99免费| 天天干人人乐| 欧美综合自拍成人自拍第二十页| 超碰到97情色| 一级黄色视频网| 亚洲精品美女久久久久久久久| 国产农村妇女精品一| 国产精品午夜福利| 天美麻花大全视频| 91老司机在线| 色色色综合| 欧美日韩国产人人| 在线A日本| 国产原创精品| 超碰97丝袜| 3p国产欧美99热| 男人的天堂不卡一区二区| 久久久久久久久国产| 26uuu国产亚洲综合| 亚洲精品日韩国产欧美| 欧洲大香蕉| 日韩黄片视频试看| 久久99精品九九久久久婷婷| 乱伦一区二区三区‘| 亚洲天堂另类小说男人| 91艹B视频| 欧美天天综合站| 成人无遮挡毛片免费看| 欧美夜夜骑视频| 国产精品毛片?v一区二区三区| 嗯嗯嗯啊啊啊操的我好爽| 女性91网站| 啊啊啊啊视频免费| 久久久久九九九| 久久女女| oumeisetu综合| 亚洲开心网| 97综合在线观看| 懂色Av| 色情成人五月天| 天堂v无码免费视频| 试看福利| 大香蕉在线视频15| 日日噜噜夜夜狠狠视频无| 国产不卡片| 天天看天天干| 青青草原av| 99热国产| 亚洲丝袜二区| 亚洲无码 国产无码| 亚洲欧洲第二视频在线观看色图| 综合网色| 欧美传媒| 欧美97av| 宅男午夜在线视频| 大香蕉AV在线| 日韩一性一交一A片俄罗斯| 精品大全99999| 亚洲精品男人的天堂| 欧美日韩*字幕一区| 青青草成人视频在线观看二区| 在线观看日韩av不卡| 东京热毛片177b2viP| 欧美韩国你懂得在线 | 在线中文AV| 日本岛国黄色网址| 中文字幕一二区二三区人妻专区| 亚洲丝袜在线观看| 色www精品视频在线观看| 蜜乳av首页| 免费一二区| 啊啊啊不要好爽日韩无码一区| 一区二区三区机械有限公司| 青青草自拍视频在线播放| 国产多人在线观看视频| 香蕉99秘 一区精品蜜桃臀| AND人妻系列| 做爱A级亚欧| 天天肏夜夜肏| Aa东京男人的天堂| 97人人爱人人做人人乐| 久久久国产三级黄色片| a天堂视频| 思思久热在线精品66| 物业黑人 AV一区| 无码 黑人一区二区三区| 91欧美美女日韩国产婷婷| 久久黄色网址| 床戏久久久av一区二区麻豆| 八人操人人摸人人看| 大肉棒导航| 国产一区二区三区,在线观看观看| 一区在线精品中文字幕| 99热18这里只有精品| 一级一性爱免费视频| 久久华人网| 麻豆久久久一区二区| 人妻一区二区三区四区视频| 久久有码视频| 少妇贴图| 熟女高潮精品一区二区| 伊人久大| 色97国产69香蕉| 国产久久一区二区| 怡春苑东京热| 爱爱久久| 天天综合网91入口| 久久超碰、| 激情五月综合网| 十八禁视频网站| 93人人操人人| 播播亚洲小说亚洲| 亚洲欧美国产日本一区二区三区| 中日韩欧美精品无码AⅤ一区二区| 岛国大片在线观看网站入口| 午夜.DJ高清在线观看免费7| 97亚洲欧美| 日日夜夜狠狠| 啊啊啊不要啊啊受不了了视频在线| 加勒比av官网在线| 国产资源中文字幕在线| 国产 热久久久久国产精品| 欧美日韩性爱无码| 九九九久久久久| 97亚洲中文| caoni国产亚洲av| 中文字幕在线观看网页| 综合网91| 欧美色图亚洲色图成人在在线| 亚洲素人综合| 亚洲精品精品一区二区| 亚洲性猛交| 天天拍夜夜| 26uuu性| 免费黄色片。| 欧美日本天堂| 中国AV美女| 少妇3P性爱自拍| 在线人妻熟女一区二区三区四区五区| 五月天精品| 91丨国产丨白浆| 26UUU欧美日本| 清清一区二区三区四区不卡视频| 日韩免费a级毛片无码a∨| 日韩99神马视频播放片在线播放| 家庭乱伦国产精品| 97精品97久久| 青娱乐亚洲热| 殴美大黄片| 国产精品乱码久久久| 2020视频1区2区3区| 99久久久无码精品国产人| 久久宗合97| 色五月婷婷中文字幕| 久久精品28| 欧美 日韩 国产传媒| 精品无码不卡视频| 中文字幕第9页萱萱影音先锋| 黑操B| 色欲三区| 久久9精品| 热久久91婷婷| 91粉芽高清在线一区二区| 日韩欧美性爱电影在线观看| 九九九九一区| 欧美日本不卡| 中文久久96| 亚洲中文字幕97久久精品少妇| 91美女在线观看| 欧美亚洲手机在线| 99999re| 欧美日韩天堂| 校园春色综合| 超97在线精品视频| 国产一区二区三区高清视频| 骚鸭AV| 久久9精品网站| 乱日视频| 热久久91婷婷| 老师充足的奶水小说| 丝袜综合色图| 无码91| 欧美亚洲综合色| 婷婷综合激情| 97蜜桃综合| 五月天色图影视| 一区二区三区激情在线观看| 亚洲色图大香| 亚洲熟久久| 99热亚洲天堂| 大香蕉宅男伊人| 亚洲不卡一| 热99这里有精品综合久久 | 国产精品999zyz| 亚洲操人| 亚洲欧美中日韩| 蜜桃久久久久久久久久久久| 日韩免费高清大片在线| 97操| 国产精品麻豆视频网站| 久久99网站| 国产男女无套97| 久久禁| 強姦亂倫a| 国产AV久久久蜜爱影集| 求求你操操我| 亚洲欧美首页| 人人爱人人操人人性| 96AV精品| www男人天堂| 国语国产操逼伊人AV网| 一区麻豆 高清中文字幕| 成人一二三区| 国产成人无码高清| 亚洲青青草| 2023天天操夜夜操| 国产农村妇女精品1区二区| 国产精品另类| 日韩精品永久在线观看| 亚洲瓯美色图| 亚洲乱码精品一区二区| 第二页中文字幕| 国产精品爆乳懂色蜜乳| 蜜臀人妻少妇久久在线观看| 国产1024在线播放| 国产亚卅97| 一本大道不卡一二三区| 天天综合麻豆视频| 亚洲AV永久无码一区仙野| 日韩精品三级片长长久久| 少妇一级无码精品| 亚洲一二三| 粉嫩不卡一区二区性爱| 噜噜瑟| 能看的av| 国产强奸乱伦xd| 超碰久久网| 免费一级欧美片片线观看| 亚洲天堂资源| 亚洲色吧网| 不卡av在线中文字幕| 99999这里都精品| 亚州精品丝袜-不卡成人免费| 欧美黑人熟妇精品91| 婷婷情色综合网| 插穴性爱视频在线观看| 春色91| 欧美性,色九九| 精品欧美А∨无码黑人大荫蒂 | 在线综合 亚洲 欧美中文字幕 | 人人操人人干xxx| 日韩欧美蜜桃精品久久中文字幕久久| 激情99| 91丨九色丨国产丨人妻在线| 国产精品农村妇女| 欧美成人色| 中文字幕永久在线| 亚洲国产麻豆一区二区三区| 亚洲国产精品无码AV久久久| 欧美性爱超碰97| 亚洲少妇免费视频\| 大香蕉伊在线久草麻豆天堂故事| 狠狠中文字幕| 色色色热| 91美女丝袜诱惑视频| 粉嫩绯色AV一区二区在线| 日逼97| 欧美特黄视频网站| 中文字幕黄色一起草| 搡老女人老91妇女熟女| 91网站18在线观看| 久久久艹艹艹| 免费看美国人人爽,人人操| 成人片在线播放| 日韩欧美字幕亚洲一区二区| 偷拍自拍在线视频观看| 大香网站| 欧亚免费视频| 欧美精品四区| 欧美最婬乱婬爆婬性视频 | 性感美女啊啊啊在线| 中文字幕十五区| 中文 人妻 制服| 欧美亚洲手机在线| 日本十八禁免费看污网站| 国产精品久久久久久久久AV大片| 久久久久9999| 欧美 亚洲 制服 精品| 91亚州日韩高清| 嗯嗯嗯嗯啊啊啊好紧好大| 亚洲欧美经典一区二区 | 久久线上视频免费看| 伊人麻豆传媒| 欧美亚洲日本视频久久久| 久久人妻精品| 97精品国产手机| 亚州综合在线| 日本熟女中文| 东方亚洲在线操逼天堂| 激情婷婷综合久久| 婷婷亚洲中文字幕在线| 呻吟 欧美 日本 中出| 亚洲天堂久久| 一级人妻性爱视频| 青娱乐亚洲热| 小明看看网址| 精品国产a∨一区天美传媒| 亚洲欧美97| 人人操,人人插| 北京专精特新企业招聘信息| 精品人妻一区二区三区不卡断 | AV99热18这里只有精品| 亚洲精品久久久久久久蜜桃臀| 韩国一级婬片A片无码天美| 99热超碰| 国产精品成人AV片免费看网站 | 手机在线观看不卡无码av| 69综合网| 超清中文乱码字幕| 日本99热| 操老熟女AV| 人人模人人看| AV高清一区| 久久久夜夜夜| 亚洲熟女中文字幕在线| 久久视网78| 一级乱伦网站| 禁十八久久| 国产黄色剧情影片麻豆免费播放| 国产不卡精品91| 青草草免费网站av| 97国产|免费| 久久99精品视频| 欧美久久人体| 红杏大香蕉| 欧美色青| 330Dv国产女人终合视频极品人与兽| 国产精品一区二区手机看片| 超碰人人色| 婷婷五月天综合网| 91操操操操| 白丝1区2区3区| 国产精品久久妻无码网站| 中文字幕AV片| 天天爱天天操| 亚洲成?V人片在线观看福利| v91av| 日本超碰在线国产一区| 色黄色美女大长腿午夜视频| 亚洲天堂2020| 日日97| 啊啊啊好湿久久| 欧美午夜精品久久久久久超碰| 亚洲欧美另类激情小说| 精品国产乱码久久久久久免费| 五月天激情综合网| 国产女同视频在线播放| 日产成人久久| 六月婷婷激情| 在线观看免费视频国产| 91日产桃蜜| 91视频观看网站| 亚洲欧洲日韩天堂av| 国产精品夜夜| 91少妇高潮| 九九夜精品九九在线| 日本网色| 每日更新AV| 国产精品久久久久久久久久久久久久| 日韩人人精品| 老司机午夜精品福利视频一区二区| 加勒比久久综合网高清| 亚洲本色精品一区二区久久| 欧美日韩亚洲天堂| 久久仑合| 亚洲91综合| 欧美亚洲成人在线一区二区三区| 久久亚洲熟妇在线视频| 久久久9 9 9精品| 麻豆福利视频导航| 久久色激情一区二区三区| 亚州免费啪啪视频| 小视频玖玖| 秋霞午夜成人福利片片| 校园春色五月天| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 中文AV制服乱伦| 深夜国产福利| 日韩有码中文字幕女同性恋| 九九九国产| 91狠狠综合久久| 人人操人人精品影片| 91天天c| 狠狠色一区二区中文字幕| 久插综合| 加勒比海成人视频网| 欧美亚洲涩涩| 精品人妻一区二区三区不卡断| 综合网久久| juliaann丝袜大战黑鬼| 麻豆传媒一区二区在线观看| 热热色色综合| 欧综合网| 乱操乱伦AV| 亚洲最大成人a毛毛片| 免费精品人妻一区二区三| 国产精品自在自拍视频| 欧美久久九九| 欧美国产操逼| 99re视频这里只有精品| 国产99999| 日韩国产不卡在线视频| 日本久久99| 久久久久久性爱片| 中国小夫妻勾搭露脸淫荡对白 | 亚洲欧美日产国产91毛片| 九九热只有精品| 国产一区二区三三视频| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 国产极品久久久| 白 大 人妻 区 在线| 欧美九一精品久久久熟妇| 91九色丰满高潮| 999精品乱码| 强奸国产精品视频| 一二三四视频中文字幕在线看| 五月婷婷丁香六月丁香| 欧美 亚洲 制服 精品| 久久超碰、| 日韩人人精品| 无码高清操逼网址| 中文字幕少妇色| 人妻人久久精品中文字幕| 9丨久久九九九| 芊芊操逼视频无码| 蜜臀久久99精品| 91美女网站| 国产精品亚洲一区二区三区四区 | 九九九久千久久激情蜜桃在线看| 97免费在线视频| 青青草视频久久| 亚洲乱妇p22| 大香交伊人网| 一级一性爱免费视频| 97干色天堂| 无码137片内射在线影院| 日韩内射视频| 日本乱人伦片中文三区| 伦理日韩国产久久| 屌逼传媒| 日本免费不卡二区| 高清一区AV无码| 白嫩91在线亚洲| 一级aaaaa欧美中文字幕录像片| 97硬碰| 国产真实野战在线视频| 欧美色性情| 熟妇一区,二区,三区。| 久草成人福利导航| 国产精品一二三在线看| 亚洲美女黄色| 探花一区在线| 成人怡红院| 久久久久无码| 岛国AB视频| 91超碰丝袜制服| 天天插天天插| 人妻精品视频一区二区三区| 亚洲欧美日韩电影网站一区| 色色五月丁香| 国产偷拍网站| 久久久天堂| 久久久99久9| 国产1769在线| 中英熟女操女| 天天搞欧美| 国产精品一二三区福利| 太久视频| 亚洲啪AⅤ永久无码| 999色欧美中文字幕| 久久色人体| 国产成人超碰在线| 2017亚洲天堂| 东京热AV男人的天堂| 性色乱AV一区二区| 亚洲AV无码翔田千里网站| 91视频伊人| 亚洲中文字幕在现观看| 日本一级特级毛片视频| 骚女高跟AV在线| 超碰综合色| 色色99| 日韩少妇丰满亚洲| 国产精品网站www| 日本不卡码黄色| 精品乱子一区二区三区99| 亚洲丝袜色图| 亚洲午夜蜜臀| 伊人91| 内射老妇BBWX0C0CK| 国产亚洲精品无码三区| 操逼操网| 天天做天天爱天天爽| 野狼激情网| 福利一级版子| 亚洲欧美综合| 啪啪资源网| 插日本熟女视频| 国产高清无码一区三区二区| 国产精品一级片在线看| 手机看av网站在线看| 人妻乱仑一区二区三区| 五月婷婷综合网| 亚洲五码一区二区三区| 婷婷在线视频| 插老姨肥穴| 超碰97欧美日韩| 精品人妻一区春色| 精品人妻高清麻豆av| 天美91| 亚洲精品三区在线观看| 岛国艾薇凹凸视频天堂| 韩日精品四区| 九九九热精品| 人人操人人干xxx| 亚洲图片欧洲图片aⅴ| 激情五月婷婷综合| 亚洲影视综合网| 小骚逼被操的爽不爽| 大香交| a片在线播放| 久久久精品视频免费观看| 日韩一级片在线看| 熟女视频久久| 加勒比海成人视频网 | 国产精品 久久久精品一牛| 天堂岛av| 60秒免费视频| 日韩av不卡在线看| 大香网伊人久久综合网eew| 久久精品国产97欧美精品亚洲 | 97一区二区三区视频| 女同性恋中文字幕| 大学生口爆吞精| 91精品国产综合久久久蜜臀| 精品视频久久区| 草草草视频| 日本九九九九| 欧美激情 亚洲色图| 国产人伦a片信息免费片| 五月综合久久| 97在线免费看视频| 91青视频| 手机午夜电影神马久久| 秋霞影音一区二区三区| 亚洲麻豆18发?| 精品人妻av在线播放| 丝袜综合色图| 99热99在线播放激情| 嗯嗯啊啊用力视频免费| 蜜臀久久99精品久久久久久-DVD原版全| 新版天堂中文资源8在线| 91成人在线| 天天干人人干天天日97| 丝袜狠狠草尤物 91| 欧美日韩一区二区三区四区蜜桃| 欧美黄色图片| 欧美偷拍区| 综合一区二区影视| 日日干夜夜干| 日欧亚洲二三区大片不卡| 99re95| 久久国色天香香蕉| 97在线精品| 国产肏逼网站| 蜜臀AV一区二区三区| 成人熟女区| 精品视频久久久久九九九九9999| 可以免费看黄片的视频| 99精品综合久久久久五月天| 97香焦色区| 丁香婷婷九月| 视频国产成人精品日本亚洲18| 日韩亚洲美女一区久久| 欧美性爱中文字幕无线码| 人人噜夜夜操| 丁香六月婷婷综合| 大黄片做爱的大的| 八人操人人摸人人看| 五月丁香六月综合缴清无码| 久久无码精品| 992视频一区| 色欲人妻一区二区在线| 久久综合久久综合人久久夜精品| 3p国产欧美99热| 青青伊人这里只有精品| 玖玖久久久| 欧美色九九| 老女人综合| 97在线视频网站| 伊人嫩草| 国产美女高潮| 九九碰九九爱97超碰| 岛国激情视频在线观看| 亚洲成人性爱在线观看| 久热香蕉精品在线视频| 素人一区二区三区日韩| 黄色激情电影在线观看| 亚洲色图尤物视频| 九九九999久久久网站| 中文字幕免费看| 青青草原av| 九九热三级片| 男人综合网| 九九九国产| 一起草三级AV电影在线观看| 国产无码精品久久久久久| 伊人一级免费黄片| 色狠狠 - 百度| 婷婷五月天激情网| 99国产精品久久久久久久成人热| 一个人免费HD91视频| 日日干夜夜欢| 九九性爱网| 久久25| 夜间福利片1000无码| 97 视频在线| 五月综合色| 伊人欧美大香蕉视频| 香一区二区三区| 国产熟女乱论| 91亚洲网| 一区二区三区色综合| 天天摸夜夜添无码小视频| 9I1性色影院| 91色综合激情| 91neishe| 婷婷激情五月| 欧美,日韩综合久久| 澳门黄片一香蕉视频| 青青草华人在线欧美在线| 另类亚洲图色| 亚洲国男人的天堂| 日本99热| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 亚州高清色综合| 亚洲情色五月天 | 激情文学 亚洲图片| 天操天操夜操夜月操月年年操| 91久操| 日本超碰在线国产一区| 亚洲欧美日韩精品久久久一区二区| 98精品国产乱码久久久久久| 97爱欧美| 久久精品老司| 国产和美国毛片| 在线中文AV| 精品人妻伦一区二区三区久久| 黄色不卡视频| 亚洲棕合电彰| 不卡九肏| 日日夜夜草草草| 色偷偷色偷偷欧美日韩| 九九九九免费视频| 久久久月天| 一级毛片电影免费看| 91视频精品| 精品人妻免费观看| 国产性久久久| 18禁中文字幕| 亚洲男人bt天堂| 99热导航| 97在线观看视频| 97视频在线播放| 高清视频一区| 精品亚洲国产成人精品| 日本黄 R色 成 人网站| 大香蕉十区| 中文字幕一区二区三区人妻不卡 | 91丝袜在线播放| 国产精品日韩在线一区| 夜嗨影院| 观看视频图片一区二区三区| 人妻喷水| 天天干干天天干干| 中文字幕亚洲欧美在线不卡| 欧美日韩亚洲国产中文永久天天看| 97啪啪| 99自拍视频在线观看| 9999亚洲电影| 性爱视频免费网址| 成人日韩中文字幕| 精品人妻一区二区三区四区不卡在| 大香蕉一级黄色片久久| 久久人妻精品| 欧美成人精品欧美一级乱黄一区二…| 人人看欧美性爱| 天天弄欧美| av网站免费线看| 另类图片五月| 懂色AV网| 97人人干| 安微少妇操BBB| 香蕉视频欧美一卡二卡| 国产一区二区在线播放量| 久久激情五月| 无码78| 无码抄逼网| 亚洲国产日韩精品久久久| 久久人人爽人人爽人人片Ⅴ| 欧美性少妇| 五月婷婷六月色| 国产呦精品系列在线观看| 国产欧美伊人| 国产操逼视频在线观看| 久操高青| 欧美色图20p| 大香蕉黄色一区| 久久在线观看免费视频| 天天α片| 超碰在线成人| 色色色日本| 制服乱伦| 老熟妇一区二区三区啪啪| 日本不卡二区| 国产丸一视频| 9999久久久久| 欧美啪啪啪91| 国产suv精品一区二区四区999| 熟女高潮合集-永久久久-成人AV| 欧洲综合视频| 国产天天骚| 1区2区3区中文字幕日韩| 偷拍超碰| 免费亚洲国产精品久久一区| 人人手机欧洲亚洲国产人妻| 日韩二级| 很很很很操| 91久久国产精品| 91性感在线| 精品成人无码| 欧美顶级黄片AAAAA在线免费看| a在线视频免费观看| 高潮9999外国| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 综合婷婷| 人妻在线视频| AAAA级日本片免费视频| 亚州91| 久久久久网站-538在线视频-欧美永久乱码 | 国产精品99精品视频网站| 大香蕉一人在线| 啊啊啊不要好疼视频| 日韩高清黄片| 国产AV色黄看到爽| 久久人人爽爽人人爽人人片αV| aaa亚无码专区| 精品人体无圣光凹凸| 青青伊人这里只有精品| 国产精品亚洲一区二区三区四区| 日日骚精品视频| 色妺妺在线视频| 测评在线观看AV| 久久久久久99999国产精品| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 国产性刺激| 日本不卡码黄色| 亚洲五区熟女| 97蜜桃综合| 国产精品久久久777| 91美女国产在线| 久欲AV| 高清孕妇孕交 交| 一个色导综合| 国产福利av精彩对白| 国产亚洲人妻综合日韩 久久| 国产精品91一样| 97超碰超欧美。| 啊啊啊免费视频| 欧美日韩性爱操大逼| 中文字幕人妻丝袜| 99RE在线视频精品,这里只有精品| 亚洲宅男天堂| 日韩精品电影| 黑人免费福利视频| 伊人色综合网电影| 超碰性爱97| 欧美91网| 国产成人精品无码久久| 欧美综合色站| 一区超碰一区| 欧美性爱日韩高清| 久久亚洲婷婷| 久久久久久免费电影| 九九九免费视频| 67914亚洲精品| 亚洲脚交| 色综合色| 中出91视频| 色婷婷香蕉| 欧美一区二区三区黄色影视| 91东京热男人的天堂| 九九九九九九九九九九九免费国产| 欧美日韩小说| 欧美99热| 九九九免费视频| 乳欲人妻办公室奶水| 亚洲操操操| 久久久蜜桃臀无码视频| 中文字幕av色| 超碰95| 久偷拍| 欧美老妇曰批的视频| 偷拍综合亚洲| 久久xxxx| 欧洲亚洲国产综合在线| aaa淫乱视频| 精品久9| 午夜福利久久久噜久噜久久综合| 肏逼视频日本| 男人的天堂.com| 国产h小视频在线观看免费| 97色色,97综合| 欧亚免费视频| 欧美影院一区二区三区| 亚洲色图a| 色情综合| 狠狠操夜夜| 国产精品不卡一区二区三区| 五月天成人综合| 国产在线视频二区| 妇女一区二区三区| 爽爽淫人网| 国产 三级自拍| 伊人欧美大香蕉视频| 伊人国产av| 日韩精品在线观看网站| 91P0RNY大屁股人妻| 蜜桃午夜视频一区二区 | 漂亮人妻被强中文字幕hd| 嗯阿好爽好紧| 日本免费中文一区二区三区四区| 欧美一级美片在线观看免费| 久操国产在线| 久久久免费高清中文视频| 蜜臀国产AV中文字幕| 久久精品性| 自拍大香蕉乱插| 精品中文字幕第一页| 玖玖综合网| 欧美日综合| 九九九999久久久网站| 青青草吊丝| 18岁禁 茉莉成人久久| 91狠婷| 日本午夜福利视频| 亚洲人在线| 安徽熟妇视频| 精品国产一区二区三区久久久蜜臀 | 综合色久欲| 欧美色66| 亚洲丝袜诱惑| surenchaopeng| 十八禁的黄污污免费网站| 97视频在线免费| 香蕉黄色一级视频| 亚洲色图殴美色图激情乱伦| 射丝袜大香蕉| 欧美日韩人人精品| 日韩少妇无吗| av影片在线观看不卡| 韩国手机不卡无码三级视频| 国产精品久久久久久无码红治院| 色墦五月丁香| 伊人四虎综合| 国产黄片在线免费观看| 99re3这里只有精品| 暴力av在线| 免费看日本操逼视频| 97超碰色屌| 三级日韩一区二区三区| 久操视频免费在线观看| 情色图区| 超清福利精品视频在线| 夜夜操天天肏| 五月天婷婷在线看| 少妇500双飞99| 精品国产无码中文| 秋霞一区二区三区四区五区六区七区| 欧美性爱精品七区| 天天日天天射天天干| 91人妻精华帖| 校园春色欧美| 婷婷视频网| 亚洲图片欧美| 激情第四色| 941超碰| 亚洲欧美日韩综合在线尤物 | 日本免费不卡二区| 美女好片色日本| 亚洲欧洲视频小说在线观看| 精品国产三级av韩国在线| 熟妇熟女一区二区三区| 岛国小电影| 天天激情综合站| 91老妇女| 欧美熟女妇同| 色播五月丁香| 欧美黄色片在线播放| 大香蕉懂9| 亚洲美女 晚间男人天堂 | 无码人妻系列少妇| 67194无码不卡| 99色婷婷| 精品性爱无码在线播放| 一区二区免费电影久久| 日逼97| 婷婷五月天久久久| 在线综合 亚洲 欧美中文字幕| 青青草好吊色| 精品少妇高潮久久| 67914在线兔费成人视频| 欧美色日| 夜夜 中文视频rt| 综合日韩激情另类图片| 乱人伦 国语对白:视频直接看| 日本成人电影资源网| 亚洲蜜乳av| 国产成人精品必看| 草草影院最新网址| 天天综合网~91| 无套后入双马尾| 欧美在线 亚洲| 美日韩在线不卡人妻| 天天色播| 日韩婷婷| 嗯啊不要在线| 日日干日日| 婷婷久草| 久久男人的天堂国产| 久久国产精品一级二级三级| 天天日天天插| 超碰人人乐97| 亚州成人A√| 欧美综合第一| 情色av电影| 天天摸夜夜操视频| 久久久111| 日韩一级二级三级免费看完整版国语版 | 91蜜臀熟女| 很黄很污的免费网站| 天天综合亚在线| 中文字幕一区 二区三四五 区日 日骚 | 91在线无码精品秘 软件| 特级丰满少妇一级AAAA爱毛片| 日本高清一区二区在线| 免费精品福利在线观看| 亚洲.欧美.丝袜.中文.综合| 九九九九九九九精品视频| 国产精品熟女乱伦| 色婷婷六月| 啊啊啊啊啊啊好湿好爽视频| 久久久9品一区二区三区| 伊人久久大香蕉线AV五月天| 九99久久| 亚洲三级。日韩三级| 国产性爱强奸乱伦大全| 蜜臀AV秘一区翔田千里| 一级久久久久久久久久久| 中文字幕日韩电影人妻| 青青伊人这里只有精品| 欧美在线播放aaaa| 亚洲欧美九九九| 亚洲在高跟鞋自慰久久在色线| 久久久禁| 97超碰精品| 久久性爱网站| 色婷久久| 亚洲欧洲偷拍一区| 国产精品日日摸天天碰| 97美日韩视频| 74成人在线| 日韩中文字幕在线视频观看| 狠狠综合网| 久久骚少妇| 91国产丝袜白虎| 岛国福利在线精品播放| 日韩一级特黄av毛片| 色蜜AV| 欧美亚洲成人在线一区二区三区| 人妻丰满熟妇av无码区蜜桃| 欧美18老人禁| 久99视频| 加勒比av中文| 蜜臀网 一区| 欧美日韩国产黄色片| 91碰碰| AV中文字幕剧情1区2区3| 天天干人人乐| 欧美劲爆视频一区二区| 亚洲成人精品久久久| 日本久久久久久久久久| 中文色综合| 六月丁香网| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 国产成人在线观看网址| 欧美亚洲另类在线蜜桃| 青青草吊丝| a啊啊啊啊啊啊啊啊一区二区| 久久国产性爱| 久草视频制服诱惑| 老鸭窝成人| 做爱A级亚欧| 欧中日成人免费影视| 东京热天堂网| 欧美 亚洲 偷拍自拍| a人欧美综合天堂麻豆| 国产熟女精品一区二区| 久久99精品视频| 欧美性生活内射| 青青草在线视频播放器| 亚洲美女自拍偷拍视频| 久久98| 丝袜天堂网| 26uuu国产成人综合| 欧美色图下一页| 国产白丝精品在线观看| 婷婷五月天基地| 一本大道久| 欧美色综合影院| 国产吹潮女在线观看| 国产精品岛国片在线观看| 91欧美在线| 中国AAAAAA黄色片| 色在线综合| 97爱欧美| 五月激情综合网| 精品免费成人久久| 嗯嗯不要 视频| 成人免费福利在线观看| 哑洲在线| 韩国久久97| 中文字幕国产| 中文字幕97色| 极品白嫩美女白浆成人福利在线看| 97久操| 好湿好紧好爽 视频| 少妇人妻好深太紧了vr91| 午夜福利合集| 亚洲第91页| 夜夜操天| 盗摄女人妻在线| 操东北女人| 99re在线精品78| 国产 v乱码一区二| A级国产欧美激情在线| 亚洲综合九| 东北女人av| 一级久久性爱视频| 日韩欧美大力操| 后入式免费视频| 久久精品99久久久久久| 亚洲黑丝在线| 国产欧美岛国精品一区| 女性喷水高潮在线观看| 蜜臀久久99精品久久久久久成人小说 | 久久社区一区二区三区| 少妇久久久久久久| 天天干夜夜肏| 绯色AV粉色AV蜜臀AV| 婷婷丁香五月综合| 人人天天干干| 国产美女口爆吞精视频| 97超碰大| 蜜桃视频啊啊啊啊| 人妻无码久久一区二区三区免费| 天天干美少妇一区| 极品美女福利在线观看| 欧美激情性爱视频网站| 好舒服视频| 日韩一999精品| 亚洲天堂区| 中文字幕 国产 精品| 免费av在线播放二区| 激情婷婷丁香网| 亚洲综合性网址| 久久大线蕉一区| 嗯嗯,啊啊,国产精品| 狠狠色婷婷7777久| 性做久久久久久免费观看软件| 被男人吃奶很爽的毛片| 午夜精品久久一区二区| 99热国产| 91久久久久久久| 中文在线视频| 白 大 人妻 区 在线| 亚洲熟妇乱女区二区三区| 97午夜剧场日韩| www.夜夜| 天天干天天干天天| 色综合色综合网| 午夜黄色免费在线观看| 国产一级做a爰大片免费久久| 人人插人人摸人人| 久久久久久一日韩字幕无码| 国产一区二区三区免费视频在性观看| 中文字幕青青草| 久久久久久久久久久久97| 熟女熟妇伦久久影院毛片一区二区| 精品人妻一二三四区视频| 亚洲999综合| 亭亭在线资源| 吊色| 国产精品农村妇女精品| 啊啊啊啊嗯嗯在线久久久| 91M一社| 人妻熟妇一区二区三区| 午夜福利 成人 91| 超碰地址久久| 亚欧色图在线激情| 加勒比中文av| 人人操欧美风骚| 欧美一级黄色免费专区| 亚洲国产精品成人综合| 岛国网址国产 | 1区2区3区中文字幕日韩| 亚洲男人的天堂在线看| 农村妇女精品一区二区| 日日骚精品视频| 人妻无码久久一区二区三区免费| 一二三区在线| 熟女日韩| 三上制服丝AV| 欧美男人亚洲天堂| 5252色欧美在线| 伊蕉97蜜桃97狠狠综合干 | 搡老熟女老女人老熟妇免费视频| 亚洲精美粉嫩嫩泬在线观看 | 久久久久久97| 99婷婷一区二区| 福利伊人玖玖国产| 97国产高清视频在线观看| 日本日逼视频网| 啊啊啊啊啊操我视频| 超碰在97| 男同专区一区二区三区在线| 精品国产Av无码久久久亚洲| 都市久久精品激情亚洲|