リッチテキストフィールドを操作する
ここではリッチテキストフィールドを操作する方法について説明します。
注意
アプリケーションのUIでリッチテキストを編集すると、テキストとHTML形式の両方で格納されますが、 IModel.GetRichTextField
メソッドは単純にモデルに格納されているデータを取得するAPIです。 IModel.SetRichTextField
メソッドでデータを設定する場合は"text","html"の両方でセットするようにしてください。なお、"xaml"形式は互換性のためにあり廃止予定のフォーマットですので極力使わないようにしてください。
参照
- HTML 形式の詳細は、 リファレンス > リッチテキスト HTML の仕様 を参照してください。
値を設定する
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");
}
info
- 指定ファイルをバイト配列に読み込む際や、バイト配列をストリーム形式に変換する際に、
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);
// ...
}
info
- 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");
//...
}