概要
RichTextBoxに、保存、読み込み、印刷機能を実装する方法について紹介します。
今回は、今までのエディタのようなUIの実装から離れて、純粋に、RichTextBoxの内容を、保存、読み込み、印刷する機能を確認する アプリケーションを作成します。
コードの使い方
例
<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