You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 18:30:07