【问题标题】:Display line numbers in RichEditBox UWP在 RichEditBox UWP 中显示行号
【发布时间】:2017-05-22 08:08:07
【问题描述】:

我想知道是否可以在 UWP C# 中显示 RichEditBox 的行号(在单独的列中) ,或者如果有其他方法可以得到它。 我正在寻找解决这个问题的方法......而且对我来说似乎很奇怪,没有关于它的文档:我只需要一个简单的文本编辑器。 有很多适用于 Windows 10 的应用程序实现了它,我不认为这是不可能的。

这只是代码编辑器应用程序 CodeWriter 的一个示例。 有什么想法吗?

【问题讨论】:

  • “我正在寻找解决这个问题的方法。” - 哪一个?您询问了 2 个不同的功能:显示行号和检索行号(大概是从内容中)。
  • 我想在richeditbox 的一侧有一列显示行号。必须获取行号的事实可能与实现有关或无关。这些是旧的和低效的解决方案,它们使用在文本编辑期间更新内容的堆栈面板。
  • 不能这样做...我尝试了使用 ListView 的解决方案,但它看起来太丑了,以至于我删除了我为它制作的那个项目和 repo。真的没有人知道如何使用 RichEditBox(不是 RichTextBox!)管理 LINE NUMBERS 吗?

标签: c# xaml uwp text-editor richeditbox


【解决方案1】:

我实现了一个考虑列表和 RichEditBox 的“结果”。现在,解决方案不好,在输入了大约 50 行之后,它的速度非常慢,但至少我试过了,因为这个问题对我来说也很重要。

所以,我在一个有两列的 Grid 中设计了一个 ListView 和 RichEditBox

<ScrollViewer>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <ListView Grid.Column="0" Name="LineNumbers" ScrollViewer.VerticalScrollMode="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled"></ListView>
        <RichEditBox Grid.Column="1" x:Name="RebText" TextChanged="RebText_TextChanged" ScrollViewer.VerticalScrollMode="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled"></RichEditBox>
    </Grid>
</ScrollViewer>

在后面的代码中我添加了这个:

private void RebText_TextChanged(object sender, RoutedEventArgs e)
{
    //Clear line numbers
    LineNumbers.Items.Clear();
    int i = 1;

    //Get all the thext
    ITextRange text = RebText.Document.GetRange(0, TextConstants.MaxUnitCount);
    string s = text.Text;

    if (s != "\r")
    {
        //Replace return char with some char that will be never used (I hope...)
        string[] tmp = s.Replace("\r", "§").Split('§');
        foreach (string st in tmp)
        {
            //String, adding new line
            if (st != "")
            {
                LineNumbers.Items.Add(i++);
            }
            //No string, empty space
            else
            {
                LineNumbers.Items.Add("");
            }                      
        }
    }
}

我认为 .clear() 方法和每次都读取所有行不是一个好习惯。但是,如果您需要一个最多 50 行的快速解决方案,那么这可能就是最佳选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2020-10-24
    相关资源
    最近更新 更多