新規作成日 2020-02-15
最終更新日
RichTextBoxで扱う文書は、FlowDocument形式であるため、コードからは、文字列をそのまま追加することはできません。文字列をRichTextBoxに追加するには、FlowDocument形式にした上で追加する必要があります。
「RichTextBox クラス」のサンプルコードを参考に、コードをCode Onlyで実行できるように加工しました。
参考
WPFで、UIを作成する際、xaml表記を使用すると簡単に表記できます。しかし、データやユーザー操作によって、プログラムの実行中にUIを操作する際には、コードで操作する必要があります。
RichTextBoxで扱う文書は、FlowDocument形式であるため、直接、文字列をRichTextBoxに追加することはできません。文字列をRunクラスに入れ、RunクラスをParagraphクラスに入れ、ParagraphクラスをRichTextBoxクラスに追加します。
ParagraphクラスをRichTextBoxクラスに追加する場合、ブロック形式で追加する方法と、インライン形式で追加する方法があります。
「RichTextBox クラス」のサンプルコードでは、文字列をブロック形式で追加する方法が紹介されています。
RichTextBox に、文字列をブロック形式で追加する
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
namespace RichTextBoxCodeOnly
{
class RichTextBoxCodeOnly : Window
{
[STAThread]
public static void Main()
{
Application app = new Application();
app.Run(new RichTextBoxCodeOnly());
}
public RichTextBoxCodeOnly()
{
StackPanel myStackPanel = new StackPanel();
// ウィンドウの大きさを設定する
Width = 200;
Height = 120;
// RichTextBoxのために、内容が含まれるFlowDocumentを作成します。
FlowDocument myFlowDoc = new FlowDocument();
// 段落をFlowDocumentに追加します。
myFlowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 1")));
myFlowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 2")));
myFlowDoc.Blocks.Add(new Paragraph(new Run("Paragraph 3")));
RichTextBox myRichTextBox = new RichTextBox();
// 最初の内容をRichTextBoxに追加します。
myRichTextBox.Document = myFlowDoc;
myStackPanel.Children.Add(myRichTextBox);
this.Content = myStackPanel;
}
}
}
実行結果
RichTextBox に、文字列をインライン形式で追加する
「RichTextBox の概要」のサンプルコードでは、文字列をインライン形式で追加する方法が紹介されています。
フロー文書の最上位は、ブロック形式の要素の必要があります。
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
namespace RichTextBoxOverviewCodeOnly
{
class RichTextBoxOverviewCodeOnly : Window
{
[STAThread]
public static void Main()
{
Application app = new Application();
app.Run(new RichTextBoxOverviewCodeOnly());
}
public RichTextBoxOverviewCodeOnly()
{
StackPanel myStackPanel = new StackPanel();
// ウィンドウの大きさを設定する
Width = 250;
Height = 80;
// RichTextBoxのために、内容が含まれるFlowDocumentを作成します。
FlowDocument myFlowDoc = new FlowDocument();
// プレーンテキストといくつかの太字のテキストのRunを作成します。
Run myRun = new Run("This is flow content and you can ");
Bold myBold = new Bold(new Run("edit me!"));
// 段落を作成して、それにRunとBoldを追加します。
Paragraph myParagraph = new Paragraph();
myParagraph.Inlines.Add(myRun);
myParagraph.Inlines.Add(myBold);
// 段落をFlowDocumentに追加します。
myFlowDoc.Blocks.Add(myParagraph);
RichTextBox myRichTextBox = new RichTextBox();
// 最初の内容をRichTextBoxに追加します。
myRichTextBox.Document = myFlowDoc;
myStackPanel.Children.Add(myRichTextBox);
this.Content = myStackPanel;
}
}
}
実行結果
ほぼ同じ例です。
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
namespace RichTextBoxBlocks
{
class RichTextBoxBlocks : Window
{
[STAThread]
public static void Main()
{
Application app = new Application();
app.Run(new RichTextBoxBlocks());
}
public RichTextBoxBlocks()
{
// スタックパネルを作成する
StackPanel myStackPanel = new StackPanel();
// ウィンドウの大きさを設定する
Width = 200;
Height = 120;
// VerticalScrollBarVisibilityプロパティをAutoに設定して、新しいRichTextBoxを作成します。
RichTextBox rtb = new RichTextBox();
rtb.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
// プレーンテキストといくつかの太字のテキストのRunを作成します。
Run myRun1 = new Run();
myRun1.Text = "A RichTextBox with ";
Bold myBold = new Bold();
myBold.Inlines.Add("initial content ");
Run myRun2 = new Run();
myRun2.Text = "in it.";
// 段落を作成して、それにRunとBoldを追加します。
Paragraph myParagraph = new Paragraph();
myParagraph.Inlines.Add(myRun1);
myParagraph.Inlines.Add(myBold);
myParagraph.Inlines.Add(myRun2);
// 新しいFlowDocumentを作成し、3つの段落を追加します。
FlowDocument flowDoc = new FlowDocument();
// 段落をFlowDocumentに追加します。
flowDoc.Blocks.Add(myParagraph);
// フロー文書をRichTextBoxの文書に設定する
rtb.Document = flowDoc;
// スタックパネルに、RichTextBoxを格納する
myStackPanel.Children.Add(rtb);
this.Content = myStackPanel;
}
}
}
実行結果