WPF - Usando o controle RichTextBox II


Em meu artigo - Usando o controle RichTextBox - apresentei o controle RichTextBox da WPF e mostrei algumas de suas propriedades e como realizar algumas tarefas com o mesmo.

O RichTextBox é um controle sofisticado e altamente funcional concebido para permitir a visualização e editar objetos FlowDocument. A combinação do RichTextBox e de objetos FlowDocument fornece ao usuário o acesso a recursos avançados de edição de documentos que não existem um controle TextBox. Esses recursos incluem a formatação de texto misto, hifenização, tabelas, listas, parágrafos e imagens embutidas.

Para preencher o conteúdo de um RichTextBox estaticamente, você inclui um elemento FlowDocument como o conteúdo da declaração XAML RichTextBox. Dentro do elemento FlowDocument, você pode definir conteúdo formatado usando elementos do modelo de conteúdo de fluxo de documentos. Os Principais elementos estruturais da presentes no modelo de conteúdo incluem a Figure, Hyperlink,List, ListItem, Paragraph, Section e Table.

Para preencher o RichTextBox no código, você deve trabalhar com um objeto FlowDocument diretamente. Você pode ou criar um novo objeto FlowDocument ou obter um já existente um RichTextBox através da propriedade RichTextBox.Document.

Você manipula o conteúdo do FlowDocument selecionando partes do seu conteúdo usando um objeto System.Windows.Documents.TextSelection. O objeto TextSelection contém duas propriedades, Start e End, que identificam as posições inicial e final do conteúdo FlowDocument que você quer manipular. Uma vez que você tenha um objeto TextSelection adequado, você pode manipular seu conteúdo com o os membros TextSelection.

Para simplificar a manipulação de objetos FlowDocument, o RichTextBox suporta comandos padrão definidos pelas classes ApplicationCommands e EditingCommands a partir do System.Windows.Input.

O RichTextBox também suporta padrão combinações de teclas para executar operações básicas de formatação de texto, tais como o negrito, itálico, sublinhado e formatos de texto, bem como cortar, copiar e colar o conteúdo selecionado.

No exemplo a seguir temos um RichTextBox usado para editar um FlowDocument onde o XAML define um FlowDocument estático que contém uma variedade de elementos estruturais e de formatação. A interface com o usuário fornece um conjunto de botões para manipular o conteúdo de RichTextBox.

Os botões são usados na aplicação para dar suporte aos recursos de edição do RichTextBox e também usar estilos aplicados a partir dos mesmos diretamente no controle.

Abra o Visual C# 2010 Express Edition e crie uma nova aplicação do tipo WPF Application com o nome EditorWPF2;

Em seguida vamos definir a interface do usuário usando o controle RichTextBox com algum texto estático e botões de comando conforme leiaute abaixo:

O código XAML usado para gerar a interface é dado a seguir:

<Window x:Class="Editor_WPF2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DockPanel>
            <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
                <StackPanel.Resources>
                    <Style TargetType="{x:Type Button}">
                        <Setter Property="CommandTarget"
Value="{Binding ElementName=rtbTextBox1}" />
                    </Style>
                </StackPanel.Resources>
                <Button Content="Clear" Name="btnClear" Click="btnClear_Click" />
                <Separator Margin="5"/>
                <Button Content="Cu_t" Command="ApplicationCommands.Cut" />
                <Button Content="_Copy" Command="ApplicationCommands.Copy" />
                <Button Content="_Paste" Command="ApplicationCommands.Paste" />
                <Separator Margin="5"/>
                <Button Content="_Undo" Command="ApplicationCommands.Undo" />
                <Button Content="_Redo" Command="ApplicationCommands.Redo" />
                <Separator Margin="5"/>
                <Button Content="_Bold" Command="EditingCommands.ToggleBold" />
                <Button Content="_Italic" Command="EditingCommands.ToggleItalic" />
                <Button Content="Underline"
Command="EditingCommands.ToggleUnderline" />
                <Separator Margin="5"/>
                <Button Content="_Right" Command="EditingCommands.AlignRight" />
                <Button Content="C_enter" Command="EditingCommands.AlignCenter" />
                <Button Content="_Left" Command="EditingCommands.AlignLeft" />
            </StackPanel>
            <RichTextBox DockPanel.Dock="Bottom" Name="rtbTextBox1"
HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible">
                <FlowDocument>
                    <Paragraph FontSize="12">
                        Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam nonummy nibh euismod tincidunt ut laoreet dolore
magna aliquam erat volutpat.
                    </Paragraph>
                    <Paragraph FontSize="15">
                        Ut wisi enim ad minim veniam, quis nostrud exerci tation
ullamcorper suscipit lobortis nisl ut aliquip ex ea
commodo consequat. Duis autem vel eum iriure.
                    </Paragraph>
                    <Paragraph FontSize="18">Uma Lista</Paragraph>
                    <List>
                        <ListItem>
                            <Paragraph>
                                <Bold>Item - Negrito</Bold>
                            </Paragraph>
                        </ListItem>
                        <ListItem>
                            <Paragraph>
                                <Italic>Item - Itálico</Italic>
                            </Paragraph>
                        </ListItem>
                        <ListItem>
                            <Paragraph>
                                <Underline>Item - Sublinhado</Underline>
                            </Paragraph>
                        </ListItem>
                    </List>
                </FlowDocument>
            </RichTextBox>
        </DockPanel>
    </Grid>
</Window>

Os botões de comando usados já realizam as tarefas diretamente no controle RichTextBox vamos apenas definir o código para o evento Click do botão Clear no code-behind do arquivo MainWindow.xaml.cs conforme abaixo:

     private void btnClear_Click(object sender, RoutedEventArgs e)
        {
            // Seleciona todo o texto no FlowDocument e recorta-o
            rtbTextBox1.SelectAll();
            rtbTextBox1.Cut();
        }

Agora é só alegria...

Rode o projeto e divirta-se com os recursos do RichTextBox da WPF:

Fica a seu critério expandir os recursos usados no projeto.

Pegue o projeto completo aqui:  Editor_WPF2.zip

Simples , simples assim...

Eu sei é apenas WPF , mas eu gosto...

Referências:

José Carlos Macoratti