HeyCHのブログ

慢性疲労のへいちゃんです

【C#】RichTextBox(WPF)って何よ

今回は、「RichTextBox(WPF)って何よ」という事で、WPFのRichTextBoxについて書いていきたいと思います。
WindowsフォームアプリケーションのRichTextBoxとは違い、FlowDocumentというのを内包するのがWPFのRichTextBoxです。
XAMLで書くと以下ような感じになります。

<Window x:Class="RichTextBoxWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:RichTextBoxWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <RichTextBox>
            <FlowDocument>
                <Paragraph>
                    <Bold>Some bold text in the paragraph.</Bold>
                    Some text that is not bold.
                </Paragraph>
                <List>
                    <ListItem>
                        <Paragraph>ListItem 1</Paragraph>
                    </ListItem>
                    <ListItem>
                        <Paragraph>ListItem 2</Paragraph>
                    </ListItem>
                    <ListItem>
                        <Paragraph>ListItem 3</Paragraph>
                    </ListItem>
                </List>
                <BlockUIContainer>
                    <Image Source="C:\Users\BlackTomato\Desktop\Sample.png" Width="200" />
                </BlockUIContainer>
            </FlowDocument>
        </RichTextBox>
    </Grid>
</Window>

f:id:HeyCH:20200501234956p:plain


しかし、XAMLに直書きするというのは汎用性に欠けるため、通常はコードで書くことになると思われます。

<Window x:Class="RichTextBoxWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:RichTextBoxWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <RichTextBox x:Name="richTextBox1"/>
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace RichTextBoxWPF {
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();

            var doc = new FlowDocument();
            //Paragraph作成
            var p1 = new Paragraph();
            p1.Inlines.Add(new Bold(new Run("Some bold text in the paragraph.")));
            p1.Inlines.Add(new Run(" Some text that is not bold."));
            doc.Blocks.Add(p1);

            //List作成
            var l1 = new List();
            l1.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 1"))));
            l1.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 2"))));
            l1.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 3"))));
            doc.Blocks.Add(l1);

            //Imageの作成
            var bitmap = new BitmapImage(new Uri(@"C:\Users\BlackTomato\Desktop\Sample.png"));
            var img = new Image() { Source = bitmap, Width = 200 };
            var ui1 = new BlockUIContainer(img);
            doc.Blocks.Add(ui1);

            richTextBox1.Document = doc;
        }
    }
}

f:id:HeyCH:20200502001252p:plain

次回から、「5ちゃんねるビューアー」のRichTextBox版を作ってみようかと考えています。
しかし、今のところどうやればいいかわからないため時間がかかりそうです。