- 示例工程
【免费下载链接】WPF-Samples
Repository for WPF related 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 中。窗口整体演示了四件事:
- 在
TextBox中开启拼写检查,自动标注拼写错误的词; - 在
RichTextBox中开启拼写检查,并展示多语言(英语 / 意大利语)混排下的按语言校验; - 提供一个"输入单词 → 点击 Check → 输出建议列表"的交互面板;
- 用代码方式(而非仅 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 取回结果。整个流程分为三步:
- 构造临时控件并启用检查:
textBox.SpellCheck.IsEnabled = true;(注意这里是通过代码设置附加属性,与 XAML 中的声明等价); - 定位错误:
textBox.GetSpellingError(0)从字符索引0处开始查找拼写错误,返回SpellingError对象;若该位置不存在错误则返回null; - 读取建议:
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
相关推荐
WPF 拼写检查自定义字典(Custom Dictionaries)示例详解:让 TextBox 识别专业术语与虚构词
WPF 拼写检查自定义字典(Custom Dictionaries)示例详解:让 TextBox 识别专业术语与虚构词 本篇技术指南聚焦 WPF Samples
示例工程WPF 层级数据绑定实战:深入解析 WPF-Samples 的 HierarchicalDataTemplate 示例
WPF 层级数据绑定实战:深入解析 WPF Samples 的 HierarchicalDataTemplate 示例 导读 在 WPF 开发中,"列表里嵌套列
示例工程Zsh 与 Bash 全面对比:面向 refine 工程实践的命令行与脚本指南
Zsh 与 Bash 全面对比:面向 refine 工程实践的命令行与脚本指南 本篇指南系统对比 Unix 世界两大主流 Shell——Bash(Bourne
示例工程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考