2016-07-06 3 views
2

RichTextbox에 특정 위치와 특정 색으로 문자열을 삽입하고 싶습니다. 그래서 RichTextbox 클래스의 AppendText() 메서드에 대한 확장을 추가하려고했습니다. RichTextbox의 특정 색으로 특정 색인에 텍스트 삽입

public static void AppendText(this RichTextBox Box, string Text, Color col, int SelectionStart) 
{ 
    Box.SelectionStart = SelectionStart; 
    Box.SelectionLength = 0; 

    Box.SelectionColor = col; 
    Box.SelectionBackColor = col; 
    Box.Text = Box.Text.Insert(SelectionStart, Text); 
    Box.SelectionColor = Box.ForeColor; 
} 

나는 RichTextBoxExtension라는 클래스에서 이것을 사용했습니다. 그 결과는 내 기대에 따른 것이 아닙니다. 문자열이 삽입되었지만 선택한 색상이 아닙니다. 이 기능을 수행하는 더 좋은 방법이 있습니까?

편집 :이 기능이 필요한 이유를 알려주는 것이 흥미로울 수 있다고 생각합니다. 사실, 사용자가 닫는 괄호를 쓸 때, 나는 연관 여는 괄호를 highligh (또는 color)하고 싶습니다. 예를 들어 사용자가 (Mytext)를 쓰는 경우 사용자가 ")"을 탭하고이 괄호 위에 선택을 유지하면 첫 번째 괄호가 색상으로 표시됩니다.

+2

Text 속성은 모든 서식이 손실 될 것입니다 설정. 대신 SelectionText 속성을 할당해야합니다. SelectionStart 및 SelectionLength 속성을 복원해야합니다. 혼자서 선택한 색상의 버그를 발견하게됩니다. –

+0

WinForms 질문입니다.하지만 WPF-o-sphere에서 누군가가 넘어지면 RichTextBox의 기본 FlowDocument에 'Document' 속성을 사용하여 쉽게 접근 할 수 있습니다. - 이것은 훨씬 더 강력한 편집 API를 가지고 있으며, 맞춤법 검사와 같은 다른 고급 기능을 위해 WinForms 편집기보다 선호됩니다. - WinForms에 갇혀 있다면, WPF Rich Text 편집기를 'ElementHost' 컨트롤로 호스팅하는 것이 좋습니다. – BrainSlugs83

답변

1

RichTextBox 컨트롤의 SelectedText 속성을 사용해야합니다. 또한 변경하기 전에 현재 선택 항목의 값을 추적하십시오.

귀하의 코드 (나는 한스가 암시 된 것을 포기)과 같아야합니다

public static void AppendText(this RichTextBox Box, 
           string Text,  
           Color col, 
           int SelectionStart) 
{ 
    // keep all values that will change 
    var oldStart = Box.SelectionStart; 
    var oldLen = Box.SelectionLength; 

    // 
    Box.SelectionStart = SelectionStart; 
    Box.SelectionLength = 0; 

    Box.SelectionColor = col; 
    // Or do you want to "hide" the text? White on White? 
    // Box.SelectionBackColor = col; 

    // set the selection to the text to be inserted 
    Box.SelectedText = Text; 

    // restore the values 
    // make sure to correct the start if the text 
    // is inserted before the oldStart 
    Box.SelectionStart = oldStart < SelectionStart ? oldStart : oldStart + Text.Length; 
    // overlap? 
    var oldEnd = oldStart + oldLen; 
    var selEnd = SelectionStart + Text.Length; 
    Box.SelectionLength = (oldStart < SelectionStart && oldEnd > selEnd) ? oldLen + Text.Length : oldLen; 
} 
+0

도움 주셔서 대단히 감사합니다! 나는이 해결책을 시도 할 것이고 당신에게 가능한 한 빨리 피드백을 줄 것이다. selectedText 속성은 실제로 색상을 수정하려는 텍스트입니다. 또한 커서가이 텍스트 위에 머물러있을 것입니까? 사실, 예를 들어 "(myvalue)"를 쓸 때 ")"를 쓰면 여는 괄호 "("가 강조 표시됩니다. 그러나 계속 글을 쓰면 "강조 표시"를 제거 할 수 있습니까? 행동 "? 내 질문에 분명하지 않다면, 제발 말해줘. 미안 해요, 내 영어가 완벽하지는 않습니다 ^^ ' – Seraphon91