一种改变* .SelectionColor之外的字体颜色的方法,还是一种更好地利用它的方法?

时间:2013-03-14 18:16:21

标签: vb.net richtextbox

所以,我正在尝试创建一个或两个函数来获取html标签,并将颜色与文本的其余部分区别开来(类似于Visual Studio对Dim等关键字的处理方式)。我找到的唯一方法是使用富文本框,然后执行*.SelectionColor = Color.Blue或类似的操作。有没有其他方法可以做到这一点?每当文本框更新时我都会这样做,它会将所有html标签更改为不同的颜色。这可以很好地使用一个非常短的html文件,但是当它们变得更大时,它需要太长时间,并且选择会移动光标。

那么,有没有其他方法可以做到这一点,即使我必须使用除富文本框之外的其他内容?如果没有,有没有人看到改善这种情况的方法?

以下是文本框更新时运行的两个函数。标签为蓝色,属性为红色,引号中的内容为绿色。

    '//////////////////////////////////////////////////////////////////////////
    '// findTag()
    '// -finds a tag
    '//////////////////////////////////////////////////////////////////////////
    Private Function findTag()
        Dim tag As String = ""
        Dim i As Integer = 0
        Dim startTag As Integer

        While (i < txtCurrentFile.TextLength - 1)
            If txtCurrentFile.Text(i) = "<" Then
                startTag = i
                While txtCurrentFile.Text(i) <> ">"
                    tag += txtCurrentFile.Text(i)
                    i += 1
                End While
                tag += ">"
                colorCode(startTag, tag)
                tag = ""
            End If
            i += 1
        End While
        Return Nothing
    End Function

    '//////////////////////////////////////////////////////////////////////////
    '// colorCode()
    '// -colors different tags accordingly
    '//////////////////////////////////////////////////////////////////////////
    Private Function colorCode(ByVal startIndex As Integer,
                               ByVal tag As String)
        Dim i As Integer = 0
        Dim isAttributes As Boolean = False
        Do While (tag(i) <> " " And tag(i) <> ">")
            txtCurrentFile.Select(startIndex + i, 1)
            txtCurrentFile.SelectionColor = Color.Blue
            i += 1
        Loop

        If i < tag.Length Then
            Do Until (tag(i) = ">")
                Do Until (tag(i) = Chr(34))
                    txtCurrentFile.Select(startIndex + i, 1)
                    txtCurrentFile.SelectionColor = Color.Red
                    i += 1
                Loop
                i += 1
                Do Until (tag(i) = Chr(34))
                    txtCurrentFile.Select(startIndex + i, 1)
                    txtCurrentFile.SelectionColor = Color.Purple
                    i += 1
                Loop
                i += 1
            Loop
            txtCurrentFile.Select(startIndex + i, 1)
            txtCurrentFile.SelectionColor = Color.Blue
        End If
        Return Nothing
    End Function

2 个答案:

答案 0 :(得分:3)

一些建议:

  1. 抛弃角色扫描仪。将其替换为速度更快的任何内容(RegEx,HTML Agility Pack,...)

  2. 如果你真的想保留角色扫描仪,那么将扫描限制在修改周围的区域(比如光标后面和前面200个字符)

  3. 在开始颜色处理之前记住光标的位置,并在完成后将其恢复。

  4. 实现在单独的线程上执行完整文件重新着色的背景着色器(如果用户在着色器运行时没有进行任何更改,则必须克隆RTB并仅应用更改)。

答案 1 :(得分:2)

......我不知道这是否适用于所有!!!,但如果它确实可能会很酷......

也许在webbrowser控件中打开文件并在css表中设置着色规则??

同样,我不知道这是不是一个好主意,但它可能会很好地完成这个技巧,因为它已经是你正在处理的HTML ......