John's 개발자의 관심노트

C# wpf, RichTextBox 사용방법! + 글자별 색상을 다르게 하는 방법! 본문

코드모음/C#

C# wpf, RichTextBox 사용방법! + 글자별 색상을 다르게 하는 방법!

John-Co 2023. 8. 9. 15:11

RichTextBox 는 FlowDocument 를 입력으로받고, FlowDocument 내에는 Paragraph Type 의 Text 글자를 입력 받습니다. 다시 말하자면, 다양한 특징을 가진 Text Paragraph 들은 FlowDocument 로 병합이 되고, 이를 RichTextBox Control 을 통해 View 로 보여집니다.

 

1. RichTextBox 만들기 (XAML 코드 작성)

여기서는 "RichTextBox" 와 "Button" 하나를 만들어, 테스트해보는 예제를 작성할 예정이구요, Button Event 를 등록해서 RichTextBox에 여러 속성값을 가진 개개의 Text Block 을 표현되도록 구현해보겠습니다.

 

먼저 RichTextBox 를 만드는 경우에는, 내부에 FlowDocument 도 같이 만들어 주어야하고, 각각 "x:Name" 을 활용해서 이름을 부여해 주어야 합니다.

<Grid x:Name="MainPanel">
    <Grid.RowDefinitions>
        <RowDefinition Height="50"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Button Grid.Row="0" Content="Message 추가" Click="Button_Click"/>
    <RichTextBox x:Name="RichTxtbox" Grid.Row="1" Background="Black" VerticalScrollBarVisibility="Auto" IsReadOnly="True">
        <FlowDocument x:Name="FlowDoc1" FontSize="10" PageHeight="{Binding ElementName=RichTxtbox, Path=ActualHeight}">

        </FlowDocument>
    </RichTextBox>
</Grid>

 


2. FlowDocument 등록

이제 C# Code에서 Event 처리를 통해 FlowDocument 에 값을 등록하는 코드를 작성하도록 하겠습니다. "Paragraph" 변수를 통해, Text 내용과 FontSize, Color, Margin 등 다양한 속성값을 변경해서 Flow Document 에 등록할 수 있습니다. 그 외에도 다양한 속성값을 변경할 수 있으니 다양한 아이디어로 디자인 해보시기 바랍니다.

 

추가적으로 System Resource 낭비를 막기위해 FlowDocument 의 Block 수를 제한하는 코드를 넣어보도록 하겠습니다.

private void Button_Click(object sender, RoutedEventArgs e)
{
    Paragraph pa = new Paragraph(new Run("Text 추가!!"));

    // Font Size 변경
    pa.FontSize = fsize ++;
    // Font Color 변경
    pa.Foreground = new SolidColorBrush(Color.FromArgb(0xff, 0xff, 0xff, 0xff));
    // Control Margin 변경
    pa.Margin = new Thickness(0);

    // Block 추가.
    FlowDoc1.Blocks.Add(pa);

    // Paragraph 갯수가 5개를 넘어가면, 가장 첫 번째 Block 을 삭제하도록 합니다.
    if(FlowDoc1.Blocks.Count > 5)
    {
        FlowDoc1.Blocks.Remove(FlowDoc1.Blocks.FirstBlock);
    }

}

3. 결과

모든 코드가 정상적으로 작성되고 동작이 된다면 아래와 같은 결과를 보실 수 있습니다.

 

 

반응형