☰
WPF 拼写检查实战:解读 WPF-Samples 的 Spell Checking 示例(TextBox / RichTextBox)
2026/10/15 2:36:28 网站建设 项目流程
  • 示例工程

【免费下载链接】WPF-Samples

Repository for WPF related samples

项目地址:https://gitcode.com/gh_mirrors/wp/WPF-Samples
点击查看免费下载

WPF 内置的拼写检查(Spell Checking)功能可以基于 .NET 与 Windows 的拼写检查组件,为TextBox、RichTextBox等文本编辑控件提供自动纠错标注与拼写建议。本篇文章以 WPF-Samples 仓库中的 Spell Checking 示例 为主体,逐行拆解其 XAML 与 C# 实现,讲清楚如何用一行属性开启拼写检查、如何通过GetSpellingError()与Suggestions程序化获取建议词,以及如何利用SpellCheck.CustomDictionaries接入自定义词典,让你能在自己的 WPF 应用中直接复刻这套方案。

示例概览:一个完整的拼写检查演示窗口

该示例位于仓库的Documents/Spell Checking/SpellChecking/目录,是一个独立的 WinExe WPF 应用。从 项目文件 可以看到其采用 SDK 风格工程,目标框架为net10.0-windows,并启用了UseWPF:

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net10.0-windows</TargetFramework> <UseWPF>true</UseWPF> </PropertyGroup> </Project>

应用入口通过 App.xaml 的StartupUri="MainWindow.xaml"指向主窗口,核心逻辑全部集中在 MainWindow.xaml 与 MainWindow.xaml.cs 中。窗口整体演示了四件事:

  1. 在TextBox中开启拼写检查,自动标注拼写错误的词;
  2. 在RichTextBox中开启拼写检查,并展示多语言(英语 / 意大利语)混排下的按语言校验;
  3. 提供一个"输入单词 → 点击 Check → 输出建议列表"的交互面板;
  4. 用代码方式(而非仅 XAML 声明)获取指定单词的拼写建议。

构建与运行示例

按 README 的说明,获取并运行该示例的方式如下(适用于 Visual Studio 2022 及以上版本):

  • 获取代码:不熟悉 Git 的情况下,可直接下载仓库的 ZIP 压缩包并解压,然后在 Visual Studio 中打开示例工程。
  • 部署示例:在 Visual Studio 中选择生成 > 部署解决方案(Build > Deploy Solution)。
  • 调试运行:按F5,或选择调试 > 开始调试(Debug > Start Debugging)。
  • 免调试运行:按Ctrl+F5,或选择调试 > 开始执行(不调试)(Debug > Start Without Debugging)。

示例工程不依赖外部 NuGet 包,仅使用 WPF 内置能力,因此打开工程后直接运行即可看到效果。

在 TextBox 中开启拼写检查:一个附加属性的事

WPF 的拼写检查通过附加属性SpellCheck.IsEnabled控制,它定义在System.Windows.Controls.SpellCheck类上,可以作用于TextBoxBase的派生控件(TextBox、RichTextBox)。示例在 MainWindow.xaml 中这样使用:

<Label Grid.Row="0" Content="TextBox"/> <TextBox Grid.Row="1" SpellCheck.IsEnabled="True">This is a mispeled word.</TextBox>

关键点在于:

  • SpellCheck.IsEnabled="True"一行即可让 TextBox 内所有文本参与拼写校验,拼错的单词会被红色波浪线自动标注;
  • 示例初始文本This is a mispeled word.中的mispeled就是故意写错的词,用于直观展示标注效果;
  • 由于拼写检查是对控件整体生效的,用户在此 TextBox 中输入的新内容同样会被实时校验。

RichTextBox 中的拼写检查与多语言混排

拼写检查同样适用于富文本控件。示例在 MainWindow.xaml 中为RichTextBox开启了拼写检查,并在FlowDocument中放置了分别声明为英语与意大利语的Run:

<RichTextBox Grid.Row="3" SpellCheck.IsEnabled="true" AcceptsReturn="True"> <RichTextBox.Document> <FlowDocument> <Paragraph> <Run xml:lang="en-us" FontWeight="Bold">Mispeled</Run> <Run xml:lang="en-us"> word in English</Run> <LineBreak/> <Run xml:lang="it-it" FontWeight="Bold">Erratd</Run> <Run xml:lang="it-it"> parola in italiano</Run> </Paragraph> </FlowDocument> </RichTextBox.Document> </RichTextBox>

这段 XAML 揭示了拼写检查的几个重要设计:

  • SpellCheck.IsEnabled="true"对富文本同样生效:RichTextBox内部的FlowDocument文本会参与校验;
  • xml:lang决定校验语言:每个Run上通过xml:lang声明语言标记,如en-us(英语)与it-it(意大利语)。示例中Mispeled、Erratd分别是英、意两种语言下故意拼错的词,WPF 会按各自声明的语言进行校验并标出错误;
  • AcceptsReturn="True":允许用户在编辑时按回车换行,便于输入多段落内容后观察逐段校验效果;
  • 加粗强调:FontWeight="Bold"只是用来在视觉上突出错词,与拼写检查机制本身无关,说明拼写标注与文本格式可以并存。

需要说明的是,WPF 拼写检查默认依赖英语拼写组件,若要让it-it等非英语语言生效,通常需要在系统中安装对应的语言支持组件(例如 Office 语言包提供的拼写词典)。这也是示例特意使用xml:lang声明而非依赖全局语言的原因——通过语言标记可精确控制每一段文本的校验语言。

程序化获取拼写建议:GetSpellingError 与 Suggestions

除了在界面上展示波浪线,示例还演示了如何在代码中主动查询某个单词的拼写建议,这是将拼写检查能力集成到搜索、自动纠错、词典功能中的常用手段。

核心实现位于 MainWindow.xaml.cs:

public static IReadOnlyList<string> GetSuggestions(string word) { TextBox textBox = new TextBox() { Text = word }; textBox.SpellCheck.IsEnabled = true; return textBox.GetSpellingError(0).Suggestions.ToList().AsReadOnly(); } private void OnCheckWordForSpellingSuggestions(object sender, RoutedEventArgs e) { var word = txtBoxWord.Text; if (!string.IsNullOrEmpty(word)) { var suggestions = GetSuggestions(word); if (suggestions?.Count > 0) { lbSuggestions.ItemsSource = suggestions; } } }

这段代码的价值在于:拼写建议并不一定需要界面上存在可见的输入框——示例通过new TextBox()创建一个"隐形"的临时 TextBox,把待查单词塞进其Text属性并启用拼写检查后,即可调用 API 取回结果。整个流程分为三步:

  1. 构造临时控件并启用检查:textBox.SpellCheck.IsEnabled = true;(注意这里是通过代码设置附加属性,与 XAML 中的声明等价);
  2. 定位错误:textBox.GetSpellingError(0)从字符索引0处开始查找拼写错误,返回SpellingError对象;若该位置不存在错误则返回null;
  3. 读取建议:SpellingError.Suggestions是IEnumerable<string>,示例将其通过ToList().AsReadOnly()包装为只读列表返回,并在OnCheckWordForSpellingSuggestions事件处理器中绑定到ListBox显示。

与之配套的交互面板在 MainWindow.xaml 中定义:左侧是"Check word for spelling-suggestions"输入框(txtBoxWord)与 "Check" 按钮,按钮的Click事件绑定了OnCheckWordForSpellingSuggestions;右侧是lbSuggestions列表框,用于展示建议词列表。

两点值得注意的边界情况(可从代码结构推断):

  • 当txtBoxWord.Text为空时,事件处理器直接返回,不会触发查询;
  • GetSuggestions内部对GetSpellingError(0)的返回值未做判空,若查询的是拼写正确的单词(该位置无错误),GetSpellingError(0)会返回null,直接访问.Suggestions将抛出空引用异常。在实际项目中,建议将实现改为先判空再访问,例如:
var error = textBox.GetSpellingError(0); return error != null ? error.Suggestions.ToList().AsReadOnly() : new List<string>().AsReadOnly();

延伸:用 CustomDictionaries 接入自定义词典

拼写检查的实用场景中,"专业术语总被标红"是最常见的痛点。仓库中同目录下的姊妹示例 CustomDictionaries 正好演示了解决方案:通过附加属性SpellCheck.CustomDictionaries挂载.lex词典文件,把合法词加入白名单。

其 MainWindow.xaml 用法如下:

<TextBox SpellCheck.IsEnabled="True" TextWrapping="WrapWithOverflow"> <SpellCheck.CustomDictionaries> <sys:Uri>pack://application:,,,/CustomDictionary.lex</sys:Uri> </SpellCheck.CustomDictionaries> Nonsense words like brimborion and jabberwocky are not identified as errors because they are included in CustomDictionary.lex. ... </TextBox>

关键机制:

  • SpellCheck.CustomDictionaries是一个集合属性,接收Uri列表,每个 Uri 指向一个.lex词典文件;
  • 使用 Pack URI 引用:pack://application:,,,/CustomDictionary.lex表示从应用程序包中加载该资源文件,因此需要把CustomDictionary.lex作为资源随应用一起发布;
  • .lex文件格式极简:CustomDictionary.lex 的内容就是逐行罗列的单词,每行一个合法词:
brimborion jabberwocky
  • 生效范围:词典内的词不再被判定为错误,而真正拼错的词依旧会被正确标注,从而在保留纠错能力的同时消除误报。

将该机制与本篇主示例结合,即可得到完整的拼写检查方案:TextBox/RichTextBox开启SpellCheck.IsEnabled做自动标注,通过xml:lang处理多语言,借助GetSpellingError().Suggestions提供建议词,再用自定义词典收纳领域词汇。

核心 API 一览与实战要点

综合主示例与自定义词典示例,可以总结出 WPF 拼写检查的四组核心 API:

API / 属性类型作用示例出处
SpellCheck.IsEnabled附加属性(bool)开启/关闭控件的拼写检查SpellChecking/MainWindow.xaml
SpellCheck.CustomDictionaries附加属性(Uri 集合)挂载.lex自定义词典CustomDictionaries/MainWindow.xaml
TextBoxBase.GetSpellingError(int charIndex)方法从指定字符索引返回SpellingError(无错误时返回null)SpellChecking/MainWindow.xaml.cs
SpellingError.Suggestions属性(IEnumerable<string>)当前错误的候选建议词列表SpellChecking/MainWindow.xaml.cs

实战中的几条经验:

  • 一行开启:SpellCheck.IsEnabled="True"是 TextBox 与 RichTextBox 通用的开关,无需任何额外配置即可获得默认英语拼写标注;
  • 多语言靠xml:lang:在FlowDocument的Run或Span上声明语言标记,让同一文档内不同语言的文本各按各的词典校验;
  • 建议词查询可脱离 UI:用临时 TextBox +GetSpellingError即可在任意代码路径中获取建议,但记得对GetSpellingError的返回值判空;
  • 自定义词典消灭误报:把产品名、人名、领域术语逐行写入.lex文件,再通过 Pack URI 挂载,即可在保持纠错能力的同时避免专业词被标红。

小结

WPF-Samples 的 Spell Checking 示例用不到百行代码,完整覆盖了 WPF 拼写检查从声明到编程调用的全链路:SpellCheck.IsEnabled负责界面标注,xml:lang负责多语言路由,GetSpellingError()与Suggestions负责程序化查询,配合SpellCheck.CustomDictionaries可进一步定制词典。对需要在 WPF 应用中集成拼写纠错、建议词查询或专业词典功能的开发者来说,这套源码就是最直接的可运行参考实现。

  • 示例工程

【免费下载链接】WPF-Samples

Repository for WPF related samples

项目地址:https://gitcode.com/gh_mirrors/wp/WPF-Samples
点击查看免费下载
上一篇:OpCore Simplify终极教程:如何在30分钟内完成专业级黑苹果配置
下一篇:Python跨平台应用开发终极指南:为什么Toga是开发者的首选方案?

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询