RichTextBox for WPF
HtmlFilter のカスタマイズ
RichTextBox for WPF の使い方 > HtmlFilter のカスタマイズ

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

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

例として、C1.WPF.Imaging.4 または C1.Silverlight.Imaging.5 を使用して GIF イメージのサポートを追加している HtmlFilterCustomization サンプルを見てみます。このサンプルは、ConvertingHtmlNode イベントと ConvertingTextElement イベントの両方を使用します。これは ConvertingHtmlNode イベントハンドラです。

コードのコピー
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
コードのコピー
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 は などの HTML 要素を表し、C1HtmlText はテキストノードを表します。

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

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

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

コードのコピー
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
コードのコピー
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;
       }
   }
}

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