RichTextBox for UWP
HtmlFilter のカスタム
RichTextBox の使い方 > コンテンツの設定と書式設定 > HtmlFilter のカスタム

HtmlFilter は、HTML 文字列と C1Document を相互に変換するための C1RichTextBox のコンポーネントです。また、C1HtmlDocument という HTML ドキュメントの中間表現と相互に変換することもできます。

C1HtmlDocument と C1Document の間で変換する際は、いくつかのイベントが発生するので、変換される各ノードをカスタマイズできます。以下のイベントがあります。

例として、C1.Xaml.Imaging を使用して GIF イメージのサポートを追加している HtmlFilterCustomization サンプルを見てみます。このサンプルは、HtmlFilter.ConvertingHtmlNode イベントと HtmlFilter.ConvertingTextElement イベントの両方を使用します。

HtmlFilter.ConvertinHtmlNode

これは HtmlFilter.ConvertingHtmlNode イベントハンドラです。

Visual Basic コードの書き方

Visual Basic
コードのコピー
Private Sub HtmlFilter_ConvertingHtmlNode(sender As Object, e As ConvertingHtmlNodeEventArgs)
    Dim htmlElement = TryCast(e.HtmlNode, C1HtmlElement)
    If htmlElement IsNot Nothing AndAlso htmlElement.Name = "img" Then
        Dim src As String
        If htmlElement.Attributes.TryGetValue("src", src) Then
            Dim uri = New Uri("/HtmlFilterCustomization;component/" & src, UriKind.Relative)
            Dim resource = Application.GetResourceStream(uri)
            If resource IsNot Nothing Then
                Dim imageSource = New C1Bitmap(resource.Stream).ImageSource
                Dim image = New Image() With { _
                    Key .Source = imageSource _
                }
                SetImageSource(image, src)
                e.Parent.Children.Add(New C1InlineUIContainer() With { _
                    Key .Child = image _
                })
                e.Handled = True
            End If
        End If
    End If
End Sub

C# コードの書き方

C#
コードのコピー
void HtmlFilter_ConvertingHtmlNode(object sender, ConvertingHtmlNodeEventArgs e)
{
    var htmlElement = e.HtmlNode as C1HtmlElement;
    if (htmlElement != null && htmlElement.Name == "img")
    {
        string src;
        if (htmlElement.Attributes.TryGetValue("src", out src))
        {
            var uri = new Uri("/HtmlFilterCustomization;component/" + src, UriKind.Relative);
            var resource = Application.GetResourceStream(uri);
            if(resource != null)
            {
                var imageSource = new C1Bitmap(resource.Stream).ImageSource;
                var image = new Image { Source = imageSource };
                SetImageSource(image, src);
                e.Parent.Children.Add(new C1InlineUIContainer { Child = image });
                e.Handled = true;
            }
        }
    }
}

このイベントハンドラは最初に、e.HtmlNode を C1HtmlElement にキャストします。C1HtmlNode を継承する型は2つあります。C1HtmlElement は <img/> などの HTML 要素を表し、C1HtmlText はテキストノードを表します。

C1HtmlNode オブジェクトが C1HtmlElement にキャストされると、タグ名を調べて属性にアクセスできるようになります。そこで、要素が実際に IMG タグかどうかを確認し、SRC 属性を取得します。コードの残りの部分では、適切な要素を作成して e.Parent に追加しています。SRC 値は、エクスポートする際にアクセスできるように添付プロパティとして保存されます。

変換が完了すると、ハンドラは、HtmlFilter がこの C1HtmlNode を変換できないようにするために、e.Handled を True に設定します。

HtmlFilter.ConvertingTextElement

HtmlFilter.ConvertingTextElement イベントハンドラは、次のようになります。

Visual Basic コードの書き方

Visual Basic
コードのコピー
Private Sub HtmlFilter_ConvertingTextElement(sender As Object, e As ConvertingTextElementEventArgs)
    Dim inlineContainer = TryCast(e.TextElement, C1InlineUIContainer)
    If inlineContainer IsNot Nothing Then
        Dim src = GetImageSource(inlineContainer.Child)
        If src IsNot Nothing Then
            Dim element = New C1HtmlElement("img")
            element.Attributes("src") = src
            e.Parent.Add(element)
            e.Handled = True
        End If
    End If
End Sub

C# コードの書き方

C#
コードのコピー
void HtmlFilter_ConvertingTextElement(object sender, ConvertingTextElementEventArgs e)
{
    var inlineContainer = e.TextElement as C1InlineUIContainer;
    if (inlineContainer != null)
    {
        var src = GetImageSource(inlineContainer.Child);
        if (src != null)
        {
            var element = new C1HtmlElement("img");
            element.Attributes["src"] = src;
            e.Parent.Add(element);
            e.Handled = true;
        }
    }
}

これは、C1TextElementC1HtmlElement に変換すること以外は、もう一方のハンドラとほとんど同じです。添付プロパティから SRC 値が復元され、その属性を使用して C1HtmlElement が作成されます。前と同様に、新しい要素が e.Parent に追加され、イベントは Handled としてマークされます。