Home > C# > 目的別資料 > エディタ > RichTextBox

WPFのRichTextBoxコンテンツの保存、読み込み、および印刷

最終更新日

概要

RichTextBoxに、保存、読み込み、印刷機能を実装する方法について紹介します。

今回は、今までのエディタのようなUIの実装から離れて、純粋に、RichTextBoxの内容を、保存、読み込み、印刷する機能を確認する アプリケーションを作成します。

コードの使い方

新規にWPFアプリケーションを作成して、張り付けます。 その場合は、Xamlコードの一番上に、<Windows>タグのx:Class属性に、[プロジェクト名].[コード名]が 記載されていますので、この部分を変更します。


<Window x:Class="RichTextBox001.MainWindow"				
			

ファイルコマンドの実装

RichTextBox の内容をファイルに保存し、そのコンテンツを再び RichTextBox に読み込み、その内容を印刷する方法を示します。

わかりやすくするために、新しいプロジェクト「RichTextBox002」に作成します。

保存、読み込みは、RichTextBoxの内容をファイルストリームに渡す、ファイルストリームから受け取る操作になります。

[Xaml]


<Window x:Class="RichTextBox002.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="200" Width="300">
    <StackPanel>
        
        <RichTextBox Name="richTB">
            <FlowDocument>
                <Paragraph>
                    <Run>Paragraph 1</Run>
                </Paragraph>
            </FlowDocument>
        </RichTextBox>

        <Button Click="SaveRTBContent">Save RTB Content</Button>
        <Button Click="LoadRTBContent">Load RTB Content</Button>
        <Button Click="PrintRTBContent">Print RTB Content</Button>

    </StackPanel>
</Window>
			
保存、読込、印刷

[C# ビハインドコード]


using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;
using System.IO;


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

        
        // Handle "Save RichTextBox Content" button click.
        // 「RichTextBoxの内容を保存」ボタンのクリックを処理します。
        void SaveRTBContent(Object sender, RoutedEventArgs args)
        {

            // Send an arbitrary URL and file name string specifying
            // the location to save the XAML in.
            // XAMLを中に保存するための位置を指定する、任意のURLとファイル名の文字列を送ります。
            SaveXamlPackage("C:\\test.xaml");		// パス付の保存ファイル名
        }

        // Handle "Load RichTextBox Content" button click.
        // 「RichTextBoxの内容の読込」ボタンのクリックを処理します。
        void LoadRTBContent(Object sender, RoutedEventArgs args)
        {
            // Send URL string specifying what file to retrieve XAML
            // from to load into the RichTextBox.
            // RichTextBoxに読み込むために、どんなファイルもXAMLを取得するために、指定するURL文字列を送ります。
            LoadXamlPackage("C:\\test.xaml");		// パス付の読込ファイル名
        }

        // Handle "Print RichTextBox Content" button click.
        // 「RichTextBoxの内容の印刷」ボタンのクリックを処理します。
        void PrintRTBContent(Object sender, RoutedEventArgs args)
        {
            PrintCommand();
        }

        // Save XAML in RichTextBox to a file specified by _fileName
        // _fileNameで指定するファイルを、RichTextBoxでXAMLを保存します。
        void SaveXamlPackage(string _fileName)
        {
            TextRange range;
            FileStream fStream;
            range = new TextRange(richTB.Document.ContentStart, richTB.Document.ContentEnd);
            fStream = new FileStream(_fileName, FileMode.Create);
            range.Save(fStream, DataFormats.XamlPackage);
            fStream.Close();
        }

        // Load XAML into RichTextBox from a file specified by _fileName
        // _fileNameで指定されたファイルから、RichTextBoxにXAMLを読み込みます
        void LoadXamlPackage(string _fileName)
        {
            TextRange range;
            FileStream fStream;
            if (File.Exists(_fileName))
            {
                range = new TextRange(richTB.Document.ContentStart, richTB.Document.ContentEnd);
                fStream = new FileStream(_fileName, FileMode.OpenOrCreate);
                range.Load(fStream, DataFormats.XamlPackage);
                fStream.Close();
            }
        }

        // Print RichTextBox content
        // RichTextBox内容を印刷する
        private void PrintCommand()
        {
            PrintDialog pd = new PrintDialog();
            if ((pd.ShowDialog() == true))
            {
                // use either one of the below  
                // 以下のどちらかを使用してください。
                pd.PrintVisual(richTB as Visual, "printing as visual");
                pd.PrintDocument((((IDocumentPaginatorSource)richTB.Document).DocumentPaginator), "printing as paginator");
            }
        }

    }

}
			

ビルドして、実行し、「Save RTB Content」を押すと例外が発生します。

例外が発生

中断をクリックして、終了します。

読込、保存のドライブ名を変更します。

Cドライブには、特別な手順を使用しないと読み書きできない可能性があるので、別のドライブを指定します。 ここでは、Gドライブを指定しました。存在するドライブをしてください。 また、サンプルプログラムを実行し終えたら、作成された、test.xamlファイルを削除しておきましょう。

コードの抜粋


SaveXamlPackage("G:\\test.xaml");

LoadXamlPackage("G:\\test.xaml");
			

正常に動作するようになりました。

C#の分離コード(*.xaml.cs)で、イベントコードと処理コードを分離し、イベントメソッドは、処理コードを呼び出すだけになっています。 説明はないですが、何らかの意味のあるプログラミングデザインに基づいていると推測されるので、このスタイルを踏襲したほうがいいと思います。

ファイルの保存形式は、DataFormatsクラスのXamlPackageを指定しています。

参考リンク

動作確認環境

  • WIndows 8.1 pro 64bit
  • Visual Studio Express 2013 for Desktop
このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」