如何选择给定索引和长度的 RichTextBox 文本

2024-04-23

如果只给你一个要选择的特定文本的索引和长度(或 EndIndex),你如何在 RichTextBox 的 WPF 版本中执行此操作?

这在 Textbox 中非常可行,因为您可以调用 Textbox.Select(startIndex,Length) 但我在 RTB 中没有看到任何等效的内容。

编辑:我找到了做出选择的答案

internal string Select(RichTextBox rtb, int index, int length)
        {
            TextRange textRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);

            if (textRange.Text.Length >= (index + length))
            {
                TextPointer start = textRange.Start.GetPositionAtOffset(index, LogicalDirection.Forward);
                TextPointer end = textRange.Start.GetPositionAtOffset(index + length, LogicalDirection.Backward);
                rtb.Selection.Select(start, end);
            }
            return rtb.Selection.Text;
        } 

但是,当我尝试在选择后突出显示该行时:

rtb.Selection.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Colors.LightBlue));

突出显示功能仅在第一次尝试时有效,并在第二次尝试后中断。有人知道这是什么原因吗?


好吧,这个问题很旧,但我终于找到了答案,所以我把它放在这里。

当我尝试使用 RichTextBox 制作一些 Syntaxhighlighter 时,我遇到了类似的问题。 我发现,当你玩弄应用属性值你不能简单地使用获取偏移位置不再了。我相信应用 propertyvalues 似乎会改变文档中 TextTokens 的“内部位置”,从而“阻止”此功能。

解决方法:

每当您需要与您合作时获取偏移位置第一次通话清除所有属性在文档的完整 TextRange 上,然后使用重新应用所有属性应用属性值但这一次从右到左。 (右侧表示最高偏移)

我不知道您是否应用了任何 PropertyValues(除了选择突出显示之外),因此您可能需要在其中进行更多思考。

这是我的代码引起问题时的样子:

    private void _highlightTokens(FlowDocument document)
    {
        TextRange fullRange = new TextRange(document.ContentStart, document.ContentEnd);
        foreach (Token token in _tokenizer.GetTokens(fullRange.Text))
        {
            TextPointer start = fullRange.Start.GetPositionAtOffset(token.Position);
            TextPointer end = start.GetPositionAtOffset(token.Length);

            TextRange range = new TextRange(start, end);
            range.ApplyPropertyValue(TextElement.ForegroundProperty, _getTokenColor(token));
        }
    }

我这样修复它:

    private void _highlightTokens(FlowDocument document)
    {
        TextRange fullRange = new TextRange(document.ContentStart, document.ContentEnd);
        fullRange.ClearAllProperties(); // NOTICE: first remove allProperties.
        foreach (Token token in _tokenizer.GetTokens(fullRange.Text).Reverse()) // NOTICE: Reverse() to make the "right to left" work
        {
            TextPointer start = fullRange.Start.GetPositionAtOffset(token.Position);
            TextPointer end = start.GetPositionAtOffset(token.Length);

            TextRange range = new TextRange(start, end);
            range.ApplyPropertyValue(TextElement.ForegroundProperty, _getTokenColor(token));
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何选择给定索引和长度的 RichTextBox 文本 的相关文章

  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • C# Outlook 从收件人获取 CompanyName 属性

    我目前正在使用 C 编写 Outlook 2010 AddIn 我想要的是从我从 AppointmentItem 中提取的 Recipient 对象中获取 CompanyName 属性 因此 有了 AppointmentItem 的收件人
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • 编写具有多种类型的泛型扩展方法时的类型推断问题

    我正在为 IEnumerable 编写一个通用扩展方法 用于将对象列表映射到另一个映射对象列表 这就是我希望该方法的工作方式 IList
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • WPF DataGrid - 在每行末尾添加按钮

    我想在数据网格的每一行的末尾添加一个按钮 我找到了以下 xaml 但它将按钮添加到开头 有人知道如何在所有数据绑定列之后添加它吗 这会将按钮添加到开头而不是末尾
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 将日期时间显示为 MM/dd/yyyy HH:mm 格式 C#

    在数据库中 日期时间以 MM dd yyyy HH mm ss 格式存储 但是 我想以 MM dd yyyy HH mm 格式显示日期时间 我通过使用 String Format 进行了尝试 txtCampaignStartDate Tex
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐

  • 合并数据框,保留所有项目熊猫

    如何合并两个不同的数据帧 保留每个数据帧的所有行 同时填充空白 DF1 Name Addr Num Parent Parent Addr Matt 123H 8 James 543F Adam 213H 9 James 543F James
  • “Docker 子网”有什么用?

    docker desktop 中有一个选项允许更改 Docker 子网 我没有看到这个默认子网192 168 65 0 28被用在任何地方 我尝试过了docker network inspect在每个 Docker 内部网络上 检查了 do
  • Cordova config.xml 文件被重写

    我设置了一个基本的 Cordova 项目 每当我运行 cordova build 时 IOS 中的 config xml 文件都会被重写为默认值 并且我在项目文件夹的 config xml 中添加的任何首选项都会简单地附加到配置中 IOS平
  • SQL Server Management Studio 无法连接到 Sql Server

    我已经使用 MS Web Platform Installer 2 0 安装了 Visual Web Developer 2010 SQL Server 2008 R2 和 SQL Management Studio 2008 但每当我想登
  • Java 泛型(通配符)

    我有几个关于 Java 中通用通配符的问题 有什么区别List 基本上意味着
  • Symfony2:如何在FormType中调用实体的存储库

    我尝试调用我的实体的存储库Category以我的实体的类形 式BonCommande 但是出现了这个错误 注意 未定义的属性 C wamp www Symfony test src Application VehiculeBundle Fo
  • 如何在 Spring 加载应用程序上下文后立即执行作业?

    我想在加载 Spring 上下文后运行一些作业 但我不知道该怎么做 你知道该怎么做吗 另一种可能性是注册应用程序上下文事件的侦听器 基本上与skaffman的解决方案相同 只需实现 org springframework context A
  • 更改textNode值

    有什么方法可以更改 Web 浏览器中 DOM textNode 的值吗 我特别想看看能不能change现有节点 而不是creating一个新的 为了澄清这一点 我需要使用 Javascript 来完成此操作 浏览器中的所有文本都存储在 te
  • 旋转轴标签放置不正确(matplotlib)

    我想绘制带有旋转标签的相关矩阵 但是 标签放错了位置 如下所示 我试着看看Matplotlib Python 条形图 xtick 标签的位置彼此之间有不规则的空间 https stackoverflow com questions 2147
  • 如何阻止 LogCat 输出在 Eclipse 中自动滚动?

    UPDATE 事实证明 这是 SDK 工具 R14 中的一个错误 该问题已在 2013 年 10 月 27 日发布的 R15 中得到修复 更新到最新版本可以解决已接受答案中建议的问题 我使用 Eclipse 调试视图中的 LogCat 窗口
  • int 和 uint 使用的区别以及何时使用

    使用 int 和 uint 有什么区别 到目前为止我看到的所有示例都使用 int 表示整数 使用 uint 有什么好处吗 谢谢 uint means unsignedint 您可以将其用于 0 4G 范围其中正常 有符号 int的范围是 2
  • SignalR 不能与 .Net Core 一起使用

    我正在尝试安装SignalR在我的中使用 NuGet 包管理器C Asp Net 核心项目 但我收到此错误 称 SignalR 与 net core 不兼容 它真的还不支持吗 或者我可以做些什么来让它发挥作用吗 如果有必要提及的话 我正在使
  • tkinter root.mainloop 与 While True 循环

    我正在使用 tkinter 根据我正在读取的电压显示一些标签 但是 它会在一次读取后停止执行 我发现这是由于 root mainloop 造成的 但我无法修复它 我已经包含了我的代码 root mainloop 位于 while True
  • sqlalchemy:创建关系但在数据库中没有外键约束?

    Since sqlalchemy orm relationship 已经暗示了这种关系 我不想在数据库中创建约束 我应该怎么办 目前 我在 alembic 迁移后手动删除这些约束 而不是定义 模式 级别ForeignKey http doc
  • Xcode 7 库搜索路径警告

    这是它显示的警告 找不到选项 F Applications Xcode beta app Contents Developer Platforms iPhoneOS platform Developer SDKs iPhoneOS9 0 s
  • 选择时更改单选按钮的边框颜色

    当我选择它时 我想要一个绿色的单选按钮 周围有绿色边框 这就是我所拥有的 input type radio webkit appearance none width 10px height 10px border radius 50 out
  • 将 10 个数据集(每个数据集有 80 个表)从 bigquery 导出到 Google 存储的有效方法?

    我在 BigQuery 中有 10 个数据集 每个数据集有 80 个表 我知道我可以使用控制台或 Web UI 将每个数据集中的每个表逐一导出到 google 存储 这是出于备份目的 然而 这需要一段时间 我想知道是否有更方便的方法来处理这
  • Chrome 中文本字段光标问题

    我在表单部分使用以下 css CSS username input background color FFFFFF border 2px solid DDDDDD border radius 5px 5px 5px 5px color 9E
  • Java websocket 客户端不适用于 GDAX 沙箱环境

    我正在使用 spring WebSocketWebSocketClient连接 GDAX 服务器 它在实时环境中运行良好 但相同的代码不适用于沙箱环境 这是我连接到服务器的代码 public class Test public static
  • 如何选择给定索引和长度的 RichTextBox 文本

    如果只给你一个要选择的特定文本的索引和长度 或 EndIndex 你如何在 RichTextBox 的 WPF 版本中执行此操作 这在 Textbox 中非常可行 因为您可以调用 Textbox Select startIndex Leng