0

私はWPFが初めてで、現在、構文の強調表示を持つSublime Textを作成することを勉強しています。現在のキャレット位置にある単語の TextRange を把握するのに挑戦します (シンボルを含めないでください。たとえば、for(はforのみではなく単語全体を返します)。さらに、ソリューションはファイル全体をチェックしているため、かなりのパフォーマンス. この問題の解決策はありますか? ありがとう! 以下は私のコードです

private TextRange getCurrentWordRange()
    {
        
        List<string> spaces = new List<string> { " ", "\t" ,";","(", ")", "=" };
        List<string> symbols=new List<string>{};

        TextPointer current = richTextBox.CaretPosition;
        TextPointer start = current, end = current;

        //Traverse to get the start of word
        while (start.GetPointerContext(LogicalDirection.Backward) == TextPointerContext.Text)
        {
            TextRange textRange = new TextRange(start.GetPositionAtOffset(-1), start); // get the textRange of the previous start

            if (spaces.Any(token => textRange.Text.Contains(token))) // check if textRange.Text has token that inside spaces
                break;
            else
                start = start.GetPositionAtOffset(-1);
            
        }


        //Traverse to get the end of word
        while(end.GetPointerContext(LogicalDirection.Forward)==TextPointerContext.Text)
        {
            TextRange textRange = new TextRange(end,end.GetPositionAtOffset(1)); // get the textRange of the next start
            
            if (spaces.Any(token => textRange.Text.Contains(token)))
                break;
            else
                end = end.GetPositionAtOffset(1);
        }
        
        return new TextRange(start,end);
    }

編集 幸いなことに、私は再考して、その場合に成功する可能性のある以下のコードを書きます。誰でも正しいかどうかを確認できることを願っています。ありがとうございました。

    private TextRange getCurrentWordRange()
        {
            List<string> spaces = new List<string> { " ", "\t" };
            List<string> symbols = new List<string> { ";", "(", ")", "=", "<", ">", "\"", ",", ".", "[", "]", ":" };
            TextPointer current = richTextBox.CaretPosition;
            TextPointer start = current, end = current;
            TextRange backward;
            TextRange forward;

            // check if start and end are not the Content.Start and Content.End
            if (start.GetPositionAtOffset(-1) == null)
                backward = new TextRange(start, start);
            else
                backward = new TextRange(start.GetPositionAtOffset(-1), start);

            if (end.GetPositionAtOffset(1) == null)
                forward = new TextRange(end, end);
            else
                forward = new TextRange(end, end.GetPositionAtOffset(1));



            while (!spaces.Contains(backward.Text) && start.GetPointerContext(LogicalDirection.Backward) == TextPointerContext.Text && !symbols.Contains(backward.Text))
            {
                start = start.GetPositionAtOffset(-1);
                backward = new TextRange(start, start.GetPositionAtOffset(-1));
            }
            while (!spaces.Contains(forward.Text) && end.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text && !symbols.Contains(forward.Text))
            {
                end = end.GetPositionAtOffset(1);
                forward = new TextRange(end, end.GetPositionAtOffset(1));
            }

            // if between start and end is "" then consider add a left adjacent or right adjacent symbol for further development
            if (new TextRange(start, end).Text == "")
            {
                if (symbols.Contains(backward.Text))
                {
                    start = start.GetPositionAtOffset(-1);
                }
                else if (symbols.Contains(forward.Text))
                {
                    end = end.GetPositionAtOffset(-1);
                }
            }

            return new TextRange(start, end);
}

捕獲

RTB の TextChanged イベントを作成し、いくつかの機能を実行してキーワードをチェックして強調表示しました

4

0 に答える 0