WPF TextBox添加拼写检查Adorner后无法选中文本,求解决方案
WPF TextBox拼写检查Adorner的交互修复与右键菜单实现
为什么选不了文本?
你的Adorner默认会覆盖在TextBox上层,拦截了鼠标和键盘事件,导致TextBox无法响应选中文本的操作。解决方法很直接:
让Adorner不抢交互事件
创建Adorner时,将HitTestVisible设为false,这样Adorner仅负责绘制下划线,不会拦截底层TextBox的输入交互,文本选中功能即可恢复。
代码示例:
public class SpellCheckAdorner : Adorner { public SpellCheckAdorner(UIElement adornedElement) : base(adornedElement) { HitTestVisible = false; // 关键设置:禁用Adorner的命中测试 } // 你的下划线绘制逻辑... }
实现“添加到词典”右键菜单
右键菜单直接绑定到TextBox即可,同时要能获取当前选中的未知单词:
1. 给TextBox添加右键菜单
// 创建菜单项 var addToDictItem = new MenuItem { Header = "Add to dictionary" }; addToDictItem.Click += (sender, e) => { var textBox = (TextBox)AdornedElement; var selectedWord = textBox.SelectedText.Trim(); if (string.IsNullOrWhiteSpace(selectedWord)) return; // 将单词加入自定义词典 CustomDictionary.Add(selectedWord); // 刷新Adorner,移除该单词的下划线高亮 InvalidateVisual(); }; // 绑定菜单到TextBox textBox.ContextMenu = new ContextMenu(); textBox.ContextMenu.Items.Add(addToDictItem);
2. 优化菜单显示(可选)
可以在TextBox的SelectionChanged事件中,判断选中的文本是否为未知单词,仅在需要时显示菜单:
textBox.SelectionChanged += (sender, e) => { var selectedWord = textBox.SelectedText.Trim(); addToDictItem.Visibility = CustomDictionary.IsUnknownWord(selectedWord) ? Visibility.Visible : Visibility.Collapsed; };
总结
- 选中文本问题:通过设置Adorner的
HitTestVisible = false解决,无需修改TextBox的基础配置 - 右键菜单功能:直接绑定到TextBox,通过获取选中文本完成词典添加,再刷新Adorner更新高亮状态
内容的提问来源于stack exchange,提问作者Richard Gale
相关产品推荐
相关产品推荐

