基于C# VSTO实现Word编辑模式专属自定义下划线及文字色功能问询
解决方案:C# VSTO实现Word编辑模式专属下划线与着色
核心思路
利用Word的隐藏格式属性结合VSTO事件监听,实现自定义格式仅在编辑视图可见,打印/导出时自动隐藏;同时通过自定义样式区分专属格式与常规格式,避免功能冲突。
一、初始化自定义样式(区分专属与常规格式)
插件启动时创建两个独立的字符样式,分别用于编辑模式专属下划线和着色:
private void ThisAddIn_Startup(object sender, System.EventArgs e) { // 创建编辑模式专属下划线样式 if (!this.Application.Styles["CustomEditUnderline"].Exists) { Style underlineStyle = this.Application.Styles.Add("CustomEditUnderline", WdStyleType.wdStyleTypeCharacter); underlineStyle.Font.Underline = WdUnderline.wdUnderlineWavy; underlineStyle.Font.UnderlineColor = WdColor.wdColorBlue; // 可由用户自定义颜色 underlineStyle.Font.Hidden = 1; // 标记为隐藏格式,默认不打印/导出 } // 创建编辑模式专属着色样式 if (!this.Application.Styles["CustomEditColor"].Exists) { Style colorStyle = this.Application.Styles.Add("CustomEditColor", WdStyleType.wdStyleTypeCharacter); colorStyle.Font.Color = WdColor.wdColorOrange; // 可由用户自定义颜色 colorStyle.Font.Hidden = 1; // 标记为隐藏格式 } // 绑定核心事件 this.Application.DocumentBeforePrint += Application_DocumentBeforePrint; this.Application.DocumentBeforeSave2 += Application_DocumentBeforeSave2; this.Application.WindowViewChange += Application_WindowViewChange; }
二、实现用户添加专属格式的功能
在Word功能区添加自定义按钮,让用户选中文字后一键应用专属格式:
// 应用编辑模式专属下划线 private void btnAddCustomUnderline_Click(object sender, RibbonControlEventArgs e) { Word.Selection sel = this.Application.Selection; if (sel != null && !sel.IsEmpty) { sel.Style = this.Application.Styles["CustomEditUnderline"]; // 编辑视图下自动显示隐藏格式 ShowEditModeFormats(); } } // 应用编辑模式专属着色 private void btnAddCustomColor_Click(object sender, RibbonControlEventArgs e) { Word.Selection sel = this.Application.Selection; if (sel != null && !sel.IsEmpty) { sel.Style = this.Application.Styles["CustomEditColor"]; // 编辑视图下自动显示隐藏格式 ShowEditModeFormats(); } } // 辅助方法:编辑视图下显示隐藏格式 private void ShowEditModeFormats() { var viewType = this.Application.ActiveWindow.View.Type; if (viewType == WdViewType.wdPrintLayoutView || viewType == WdViewType.wdWebLayoutView || viewType == WdViewType.wdNormalView) { this.Application.ActiveWindow.View.ShowHiddenText = true; } }
三、监听视图切换与打印/导出事件,自动控制格式显示
- 视图切换时,自动切换格式可见性:
private void Application_WindowViewChange(Word.Window Wn, WdViewType ViewType) { switch (ViewType) { // 编辑视图:显示专属格式 case WdViewType.wdPrintLayoutView: case WdViewType.wdWebLayoutView: case WdViewType.wdNormalView: Wn.View.ShowHiddenText = true; break; // 非编辑视图(打印预览、阅读视图等):隐藏专属格式 case WdViewType.wdPrintPreview: case WdViewType.wdReadingView: case WdViewType.wdOutlineView: Wn.View.ShowHiddenText = false; break; } }
- 打印前临时隐藏专属格式,打印后恢复:
private void Application_DocumentBeforePrint(Word.Document Doc, ref bool Cancel) { bool originalState = this.Application.ActiveWindow.View.ShowHiddenText; // 打印前隐藏专属格式 this.Application.ActiveWindow.View.ShowHiddenText = false; // 打印完成后恢复原状态 this.Application.DocumentAfterPrint += (s, args) => { this.Application.ActiveWindow.View.ShowHiddenText = originalState; this.Application.DocumentAfterPrint -= (s, args); }; }
- 导出PDF前临时隐藏专属格式,保存后恢复:
private void Application_DocumentBeforeSave2(Word.Document Doc, ref bool SaveAsUI, ref WdSaveFormat Format, ref bool Cancel) { if (Format == WdSaveFormat.wdFormatPDF) { bool originalState = this.Application.ActiveWindow.View.ShowHiddenText; // 导出PDF前隐藏专属格式 this.Application.ActiveWindow.View.ShowHiddenText = false; // 保存完成后恢复原状态 this.Application.DocumentAfterSave += (s, args) => { this.Application.ActiveWindow.View.ShowHiddenText = originalState; this.Application.DocumentAfterSave -= (s, args); }; } }
四、与常规格式的兼容性说明
- 专属格式使用独立自定义样式,完全区分于Word「主页」选项卡的常规下划线/着色样式,用户可正常使用常规功能,两者互不干扰。
- 若需修改专属格式的颜色,可通过插件设置界面动态调整样式的
UnderlineColor或Font.Color属性。
内容的提问来源于stack exchange,提问作者Alexandru Romînu
相关产品推荐
相关产品推荐

