WPF - Editor de arquivos XAML RichTextBox (C#)
Em meu artigo - WPF - Usando o controle RichTextBox - eu apresentei o controle RichTextBox , suas propriedades , eventos e mostrei como editar, salvar e exibir o conteúdo de um RichTextBox.
Neste o objetivo é bem mais modesto, vou apenas mostrar um editor RichTextBox para editar arquivos XAML usando a linguagem C#.
Abra então o Visual C# 2010 Express Edition e crie um novo projeto (File-> New Project) usando o modelo WPF Application com o nome EditorRichText;
A seguir vamos incluir no arquivo Window1.xaml, a partir da ToolBox, os controles DockPanel, Menu, ToolBar conforme o leiaute abaixo:
O código XAML do arquivo pode ser visto abaixo:
itle="Editor RichTextBox Simples" Width="640" Height="480"> <DockPanel> <Menu DockPanel.Dock="Top" Foreground="#FF3131C7"> <MenuItem Header="Arquivo"> <MenuItem Header="Abrir" Click="mnuFileOpen_Click"/> <MenuItem Header="Salvar" Click="mnuFileSave_Click"/> </MenuItem> </Menu> <ToolBar DockPanel.Dock="Top" Background="#F9F7E3EF"> <ComboBox Name="cboFont" Width="140" SelectionChanged="cboFont_SelectionChanged"> <ComboBoxItem Content="Times New Roman"/> <ComboBoxItem Content="Arial"/> <ComboBoxItem Content="Segoe"/> <ComboBoxItem Content="Comic Sans MS"/> <ComboBoxItem Content="Trebusch"/> <ComboBoxItem Content="Verdana"/> </ComboBox> <ComboBox Name="cboSize" Width="40" SelectionChanged="cboSize_SelectionChanged"> <ComboBoxItem Content="8"/> <ComboBoxItem Content="10"/> <ComboBoxItem Content="12"/> <ComboBoxItem Content="14"/> <ComboBoxItem Content="16"/> <ComboBoxItem Content="18"/> <ComboBoxItem Content="24"/> <ComboBoxItem Content="36"/> </ComboBox> <ComboBox Name="cboColor" Width="70" SelectionChanged="cboColor_SelectionChanged"> <ComboBoxItem Content="Preto"/> <ComboBoxItem Content="Vermelho"/> <ComboBoxItem Content="Verde"/> <ComboBoxItem Content="Azul"/> <ComboBoxItem Content="Cinza"/> </ComboBox> <ComboBox Name="cboWeight" Width="70" SelectionChanged="cboWeight_SelectionChanged"> <ComboBoxItem Content="Normal"/> <ComboBoxItem Content="Negrito"/> </ComboBox> <ComboBox Name="cboStyle" Width="70" SelectionChanged="cboStyle_SelectionChanged"> <ComboBoxItem Content="Normal"/> <ComboBoxItem Content="Italico"/> </ComboBox> </ToolBar> <RichTextBox SelectionChanged="rchNotes_SelectionChanged" Name="rchNotes" Grid.Row="1" SpellCheck.IsEnabled="True" Background="White"> <FlowDocument FontFamily="Times New Roman"> <Paragraph FontSize="18" FontWeight="Bold"> Exemplo XAML </Paragraph> <Paragraph FontSize="14"> Um editor que cria um RichTextBox quem contém um simples FlowDocument. </Paragraph> </FlowDocument> </RichTextBox> </DockPanel> </Window> |
O código code-behind correspondendo do arquivo Window1.xaml.cs é dado a seguir:
using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Media; using Microsoft.Win32; using System.Windows.Markup; using System.IO; namespace SimpleRichEditor { public partial class Window1 : Window { public Window1() { this.InitializeComponent(); } // Seleciona a fonte private void cboFont_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (rchNotes == null) return; if (e.AddedItems.Count < 1) return; ComboBoxItem item = (ComboBoxItem)e.AddedItems[0]; string value = item.Content.ToString(); FontFamily font_family = new FontFamily(value); rchNotes.Selection.ApplyPropertyValue(TextElement.FontFamilyProperty, font_family); rchNotes.Focus(); } // Seleciona o tamanho da fonte private void cboSize_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (rchNotes == null) return; if (e.AddedItems.Count < 1) return; ComboBoxItem item = (ComboBoxItem)e.AddedItems[0]; string value = item.Content.ToString(); rchNotes.Selection.ApplyPropertyValue(TextElement.FontSizeProperty, value); rchNotes.Focus(); } // Selecione a cor private void cboColor_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (rchNotes == null) return; if (e.AddedItems.Count < 1) return; ComboBoxItem item = (ComboBoxItem)e.AddedItems[0]; string value = item.Content.ToString(); switch (value) { case "Preto": rchNotes.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Black); break; case "Vermelho": rchNotes.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Red); break; case "Verde": rchNotes.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Green); break; case "Azul": rchNotes.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Blue); break; case "Cinza": rchNotes.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Gray); break; } rchNotes.Focus(); } // Seleciona o efeito private void cboWeight_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (rchNotes == null) return; if (e.AddedItems.Count < 1) return; ComboBoxItem item = (ComboBoxItem)e.AddedItems[0]; string value = item.Content.ToString(); switch (value) { case "Normal": rchNotes.Selection.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Normal); break; case "Negrito": rchNotes.Selection.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold); break; } rchNotes.Focus(); } // define o estilo private void cboStyle_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (rchNotes == null) return; if (e.AddedItems.Count < 1) return; ComboBoxItem item = (ComboBoxItem)e.AddedItems[0]; string value = item.Content.ToString(); switch (value) { case "Normal": rchNotes.Selection.ApplyPropertyValue(TextElement.FontStyleProperty, FontStyles.Normal); break; case "Italico": rchNotes.Selection.ApplyPropertyValue(TextElement.FontStyleProperty, FontStyles.Italic); break; } rchNotes.Focus(); } // Exibe a seleção de propriedades private void rchNotes_SelectionChanged(object sender, RoutedEventArgs e) { if (rchNotes == null) return; // Font family. FontFamily font_family = rchNotes.Selection.GetPropertyValue(TextElement.FontFamilyProperty) as FontFamily; if (font_family == null) { cboFont.Text = ""; } else { cboFont.Text = font_family.Source; } // tamanho. cboSize.Text = rchNotes.Selection.GetPropertyValue(TextElement.FontSizeProperty).ToString(); // Cor. SolidColorBrush br = rchNotes.Selection.GetPropertyValue(TextElement.ForegroundProperty) as SolidColorBrush; if (br == null) { cboColor.Text = ""; } else { switch (br.Color.ToString()) { case "#FF000000": cboColor.Text = "Black"; break; case "#FFFF0000": cboColor.Text = "Red"; break; case "#FF008000": cboColor.Text = "Green"; break; default: cboColor.Text = "Blue"; break; } } // Fontes. cboWeight.Text = rchNotes.Selection.GetPropertyValue(TextElement.FontWeightProperty).ToString(); // Estilo. cboStyle.Text = rchNotes.Selection.GetPropertyValue(TextElement.FontStyleProperty).ToString(); } // carrega o arquivo XAML private void mnuFileOpen_Click(object sender, RoutedEventArgs e) { OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); dlg.DefaultExt = ".xaml"; dlg.Filter = "XAML Files (.xaml)|*.xaml|All Files|*.*"; if (dlg.ShowDialog() == true) { // Abre o arquivo XamlReader reader = new XamlReader(); FileStream fs = File.OpenRead(dlg.FileName); try { // Le o FlowDocument armazenado no arquivo FlowDocument flow_document = (FlowDocument)XamlReader.Load(fs); // Exibe o novo FlowDocument. rchNotes.Document = flow_document; } catch (Exception ex) { MessageBox.Show(ex.Message, "Erro ao ler arquivo", MessageBoxButton.OK, MessageBoxImage.Error); } finally { fs.Close(); } } } // Salva o documento private void mnuFileSave_Click(object sender, RoutedEventArgs e) { // Pega o nome do arquivo SaveFileDialog dlg = new SaveFileDialog(); dlg.DefaultExt = ".xaml"; dlg.Filter = "XAML Files (.xaml)|*.xaml|All Files|*.*"; if (dlg.ShowDialog() == true) { FileStream fs = File.OpenWrite(dlg.FileName); try { // Salvar XamlWriter.Save(rchNotes.Document, fs); } catch (Exception ex) { MessageBox.Show(ex.Message, "Erro ao salvar o arquivo", MessageBoxButton.OK, MessageBoxImage.Error); } finally { fs.Close(); } } } } } |
Executando o projeto iremos obter:
Pegue o projeto completo aqui: EditorRichText.zip
Filipenses 3:20
Mas a nossa pátria está nos céus, donde também aguardamos um Salvador, o Senhor Jesus Cristo,Referências: