WPF richTextBox问题

2024-01-14

如果一行文本换行到另一行,如何以编程方式确定字符串中的断点。

示例:输入字符串 =“这是对文本换行行的测试”。

      Based on the width of the richTextBox it could display:


            This is a test of a wrapped line of
            text.

我需要确定的是被换行的单词行中的偏移量。在上面的例子中,单词“text”。

当我从 richTextBox 中提取 Xaml 时,我得到了原始文本。

Thanks,

鲍勃·克林格


我发现的技巧使用 TextPointer 类及其 GetCharacterRec 方法。

RichTextBox 保存一个 FlowDocument。流文档中的文本包含在 Run 对象中(有点简化,但它有效)。该代码在第一次运行开始时查找 TextPointer。然后它获取第一个字符的边界矩形。接下来,代码一次向前走一个字符,获取一个新的边界矩形,并检查新矩形的底部是否与原始矩形不同。如果底部不同,那么我们就在一条新线上。然后,TextPointer 可以获取中断之前或之后的文本。

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    private void inspect(object sender, RoutedEventArgs e)
    {
        TextPointer pointer = FindRun(inBox.Document);

        string textAfterBreak = FindBreak(pointer);

        outBox.Text = textAfterBreak;
    }

    private string FindBreak(TextPointer pointer)
    {
        Rect rectAtStart = pointer.GetCharacterRect(LogicalDirection.Forward);

        pointer = pointer.GetNextInsertionPosition(LogicalDirection.Forward);
        Rect currentRect = pointer.GetCharacterRect(LogicalDirection.Forward);

        while (currentRect.Bottom == rectAtStart.Bottom)
        {
            pointer = pointer.GetNextInsertionPosition(LogicalDirection.Forward);
            currentRect = pointer.GetCharacterRect(LogicalDirection.Forward);
        }

        string textBeforeBreak = pointer.GetTextInRun(LogicalDirection.Backward);
        string textAfterBreak = pointer.GetTextInRun(LogicalDirection.Forward);

        return textAfterBreak;
    }

    private TextPointer FindRun(FlowDocument document)
    {
        TextPointer position = document.ContentStart;

        while (position != null)
        {
            if (position.Parent is Run)
                break;

            position = position.GetNextContextPosition(LogicalDirection.Forward);
        }

        return position;
    }
}

<Window x:Class="LineBreaker.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <RichTextBox Grid.Row="0" Name="inBox">
        </RichTextBox>
        <Button Grid.Row="1" Click="inspect">Find Break</Button>
        <TextBox Name="outBox" Grid.Row="2"/>
    </Grid>
</Window>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF richTextBox问题 的相关文章

随机推荐

  • Chrome 扩展程序不发送 SameSite=Lax cookie

    我在通过弹出脚本的 chrome 扩展处理 cookie 时遇到一些问题 popup js 内容 document addEventListener DOMContentLoaded gt function cookieinfo chrom
  • Tesseract OCR:解析表格单元格

    我正在使用 cmd 中的 Tesseract OCR v4 0 0 alpha 从如下所示的表格的 png 中提取文本 我希望 Tesseract OCR 能够解析一个单元格中的内容 然后再转到下一个单元格 我不想继续 行 中的下一个单词
  • 关于 Google Directions API 中的 escape=tollroads 的问题

    我有一些关于 Google Directions API 的问题 Google Directions API 中的 escape tollroads 是否完全避开部分收费公路 或者它是否足够聪明 知道有些路线可以在部分收费公路上行驶 但实际
  • Android Studio 运行应用程序太慢

    当我运行我的应用程序时 大约需要 10 分钟才能在我的手机上显示 而且每次更改代码也需要 10 分钟 我应该怎么办 我在用Android Studio 2 0 在 android studio 中转到 文件 gt 设置 gt 构建 执行 部
  • 如果攻击者知道盐,那么它们对安全性是否毫无用处?

    假设我有一个这样设置的用户表 CREATE TABLE users id INTEGER PRIMARY KEY name TEXT hashed password TEXT salt TEXT 创建用户时 会生成随机生成的盐并将其与类似结
  • 如何在response.redirect中将列表作为参数传递

    问题1 我有两个列表 我想在下一页中访问它们 我将重定向它们 目前的结果 当我传递结果时 它在 url 中显示列表数据类型 ex System Collections Generic List1 IDataEntities ISearchR
  • Bash 命令查看 dir 中是否有文件 - 测试目录是否为空[重复]

    这个问题在这里已经有答案了 我有以下 bash 脚本 if ls Users david Desktop empty gt dev null then echo yes files else echo no files fi 如果目录中有一
  • 检测整数内的单个一位流

    我必须检查一个号码是否满足以下条件 在二进制中 所有一位必须是连续的 该数字必须至少设置一位 连续的一位可能从 MSB 开始或在 LSB 结束 因此如果该数字由单个一位流后跟零位流组成 则完全有效 反之亦然 我编写了一个代码来检查现实问题的
  • 身份视图在哪里?

    当我在 NET Core 2 1中创建新项目时 我找不到 Identity Account Manage后面的视图 它在哪里 现在如何更改页面样式 这些视图现在是预编译库的一部分 Microsoft AspNetCore Identity
  • PHP SoapClient 类型映射的行为不同

    我有一个 Web 服务函数 它将一组项目返回给 PHP 客户端 根据项目的数量 PHP 返回类型有所不同 如果函数返回一项 则 PHP 类型为stdClass如果函数返回多个项目 则 PHP 类型为array 无论哪种情况都应该是array
  • 更改 ng-repeat 内的角度 ui-view

    我在单个控制器中使用多个命名的 ui 视图 当使用以下代码在 html 文件中命名 ui view 时 一切都按预期工作 div class box div div div div div div div div div div div 但
  • 将 CUDA 与 Visual Studio 2017 结合使用

    我正在尝试安装 CUDA 但收到一条消息 未找到支持的 Visual Studio 版本 我认为这是因为我使用的是 Visual Studio 2017 社区 而 CUDA 目前仅支持 Visual Studio 2015 不幸的是 微软不
  • 使用 Velocity 模板语言的类型化 React 函数组件模板

    我正在使用 Webstorm 作为我的 IDE 它允许我突出显示一些 JSX 并将组件提取为功能组件 支持此功能的代码位于我不熟悉的 VTL 中 当我提取这样的组件时
  • flutter中的new_version包返回RangeError(index):无效值:有效值范围为空:1

    我在 flutter 中使用 new vesrion 0 3 1 包来显示警报对话框 如果 flutter 应用程序商店中有新版本可用 则显示更新应用程序 但我收到以下书面异常 ERROR flutter lib ui ui dart st
  • 无法让 Tensorflow 在 macOS M1 Pro 芯片上运行

    我一直在尝试进入 ML 领域 并且想学习相关课程 但它需要 Tensorflow 而且我一直在尝试让它在我的系统上运行 我有 2021 款 14 16GB Macbook Pro 配备 M1 Pro 芯片 并且运行的是 Ventura 13
  • 检测到的 JDK 版本:1.6.0-24 不在允许范围 1.7 内

    当我运行命令时 mvn clean package 我收到错误 Detected JDK Version 1 6 0 24 is not in the allowed range 1 7 如何修复上述错误 我尝试检查安装的jdk版本并得到了
  • django模型管理添加表单卡住了

    考虑一下这个 admin register Personal site admin site class PersonalAdmin admin ModelAdmin form ChangePersonalForm add form Add
  • 正则表达式匹配额外的空组

    我是正则表达式领域的新手 我下面发布的所有内容都是我的代码中的简化示例 我有一根绳子 比方说test 1 some 2 foo bar 4 我想替换为title test 1 title some 2 title foo title bar
  • 如何在 MVC 4 中不指定表单区域

    我有一个 MVC 应用程序 其中配置了区域 注销链接出现在布局页面中 因此它会显示在每个页面上 当我单击注销时 它总是将其附加到它所在的区域中 我只想让它转到帐户 注销 无区域 我尝试了以下方法 但没有成功 有什么建议吗 using Htm
  • WPF richTextBox问题

    如果一行文本换行到另一行 如何以编程方式确定字符串中的断点 示例 输入字符串 这是对文本换行行的测试 Based on the width of the richTextBox it could display This is a test