メインコンテンツまでスキップ

リッチテキストフィールドを操作する

ここではリッチテキストフィールドを操作する方法について説明します。

注意

アプリケーションのUIでリッチテキストを編集すると、テキストとHTML形式の両方で格納されますが、 IModel.GetRichTextField メソッドは単純にモデルに格納されているデータを取得するAPIです。 IModel.SetRichTextField メソッドでデータを設定する場合は"text","html"の両方でセットするようにしてください。なお、"xaml"形式は互換性のためにあり廃止予定のフォーマットですので極力使わないようにしてください。

参照

値を設定する

IModel オブジェクトの SetRichTextField メソッドを用いてリッチテキストフィールドの値を設定します。リッチテキストフィールドは複数の値を設定可能です。アプリケーションでは編集すると HTML 形式およびテキスト形式で設定されます。

public void SetRichTextField(ICommandContext c, ICommandParams p)
{
IModel model = c.App.Workspace.CurrentModel;

// 単純なテキストで追加します
var text = "aa\nbb";
model.SetRichTextField("Field1", text);

// HTMLで追加します
var htmlText = @"<html>....</html>";
model.SetRichTextField("Field1", htmlText, "html");
}

画像を設定する

リッチテキストフィールドに画像を設定するには、画像のバイト配列を文字列に変換し、その文字列で定義した値を IModel オブジェクトの SetRichTextField メソッドを用いてリッチテキストフィールドに設定します。

using System.IO;
using System.Drawing;

public void SetImageToRichText(ICommandContext c, ICommandParams p)
{
// 指定したファイルをバイト配列に読み込みます。
var filePath = c.App.Window.UI.ShowOpenFileDialog("開く", "Image Files|*.png");
if (filePath == null)
{
return;
}
var bytes = File.ReadAllBytes(filePath);

// 読み込んだバイト配列をBASE64バイナリ文字列に変換します。
var base64 = System.Convert.ToBase64String(bytes);

// 画像の幅と高さを取得するために、読み込んだバイト配列をImageに変換します。
var stream = new MemoryStream(bytes);
var image = Image.FromStream(stream);

// 変換したBASE64バイナリ文字列とImageの幅・高さを用いてHTML形式の値を定義します。
var htmlText = $"<body><p><img width=\"{image.Size.Width}\" height=\"{image.Size.Height}\" src=\"data:image/png;base64,{base64}\" /></p></body>";

// 選択されたモデルのリッチテキストフィールドに値を設定します。
IModel model = c.App.Workspace.CurrentModel;
model.SetRichTextField("Field1", htmlText, "html");
}
備考
  • 指定ファイルをバイト配列に読み込む際や、バイト配列をストリーム形式に変換する際に、 System.IO を参照します。
  • ストリーム形式のファイルを画像に変換する際に、 System.Drawing を参照します。

値を取得する

モデルのリッチテキストフィールド値を取得する場合は IModel オブジェクトの GetRichTextField メソッドを用います。

public void GetRichTextField(ICommandContext c, ICommandParams p)
{
IModel model = c.App.Workspace.CurrentModel;

// 単純なテキストで取得します
var text = model.GetRichTextField("Field1", "text");

// HTMLで取得します
var html = model.GetRichTextField("Field1", "html");

//...
}

画像を取得する

リッチテキストフィールドの画像を取得するには、 IModel オブジェクトの GetRichTextField メソッドで取得したリッチテキストフィールド値から画像部分の文字列を抽出し、その文字列をバイト配列に変換します。

using AngleSharp.Html.Parser;

public void GetImageFromRichText(ICommandContext c, ICommandParams p)
{
// 選択しているモデルのリッチテキストフィールド値を取得します。
IModel model = c.App.Workspace.CurrentModel;
var htmlText = model.GetRichTextField("Field1", "html");

// Htmlを解析しimgタグを抽出します。
var htmlDocument = new HtmlParser().ParseDocument(htmlText);
var imgElement = htmlDocument.GetElementsByTagName("img").FirstOrDefault();
if (imgElement == null)
{
return;
}

// 抽出したimgタグからBASE64バイナリ文字列を取得します。
// 抽出したimgタグのsrc属性は、"data:image/png;base64,~"となっており、
// 実際のBASE64バイナリ文字列は","より後の文字列になります。
var srcAttribute = imgElement.GetAttribute("src");
var base64 = srcAttribute.Substring(srcAttribute.IndexOf(",") + 1);

// 取得したBASE64バイナリ文字列をバイト配列に変換します。
var bytes = System.Convert.FromBase64String(base64);

// ...
}
備考
  • HTML を解析する際に、 AngleSharp.Html.Parser を参照します。

フォーマットを取得する

フィールドに格納されているリッチテキストのフォーマットを取得するには IModel オブジェクトの GetRichTextFieldFormats メソッドを用います。

public void GetRichTextFieldFormats(ICommandContext c, ICommandParams p)
{
IModel model = c.App.Workspace.CurrentModel;

IEnumerable<string> formats = model.GetRichTextFieldFormats("Field1");

//...
}