2011-06-22 16 views
1

all。私はContentControlをHTML構文の文字列を返すプロパティにバインドされているプロジェクト内に持っています。Silverlight-選択可能なテキストのコンテンツコントローラを作成する方法

コントロールのXAML

<ContentControl Height="48" 
     Margin="100,56,223,0" 
     VerticalAlignment="Top" 
     Content="{Binding HitContext, 
     Converter={StaticResource FormatConverter}, 
     Mode=TwoWay}" 
     Foreground="White" /> 

あなたは、私がこのコントロールに変換特性を持っていることに気づくでしょう。本質的には、返された文字列を評価し、htmlを取り除いてxamlに置き換えて、戻り値内のキーワードを強調表示します。ここで

は、フォーマット変換コードです:

public class HighlightConverter : IValueConverter 
{ 
    ///<summary> 
    ///Converter class used to evaluate and highlight context string results 
    ///</summary> 
    /// 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string str = value.ToString(); 

     str = str.Replace("&", "&amp;"); 
     str = str.Replace("<fragment>", " "); 
     str = str.Replace("</fragment>", " "); 
     str = str.Replace("<hilight>", "<Run Foreground=\"Gold\" FontWeight=\"ExtraBold\" FontSize=\"13\">"); 
     str = str.Replace("</hilight>", "</Run>"); 
     return XamlReader.Load("<TextBlock xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" TextWrapping=\"Wrap\" >" + str + "</TextBlock>"); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

今のところ、これが正常に動作します。文字列はビューでレンダリングされ、タグ "hilight"を持つ単語は、xaml構文としてコントロール内の強調表示された単語をレンダリングするために変換されます。また、フラグメントタグやアンパサンドの削除など、他のクリーンアップを参照することもできます。

私が問題になっているのは、実行時にコントロールからテキストを選択できる必要があるということです。 UIからテキストを選択する必要がある場合、TextBoxは通常使用されますが、UIelementにハイライトの書式設定を渡すことはできません。私もRichTextBoxを使用しようとしましたが、コントロールを作成できないことを示すxaml構文解析エラーを受け取りました。

私はstackoverflowとsilvelright.netに1つのリンクを見ましたが、ユーザーがテキストブロックにスタイルを適用するよう提案した同様の問題がありました。ただし、これはContentControl内でレンダリングされているため、スタイルを設定できませんでした。

これまでは、ViewScroller、Textbox、およびRichTextBoxを使ってみましたが、レンダリング時に解析エラーが原因ですべてが失敗しました。

私はテキストを強調表示しているので、これを実行することが可能かどうかも分かりませんし、選択する必要もあります。私はどんな提案やアイデアも歓迎する。

ありがとう、

+0

あなたの入力「HTML」の小さなサンプル(これは本当にhtmlではありませんか?)が役に立ちます。 – AnthonyWJones

答えて

0

選択可能な書式付きテキストを表示したいとします。これに対する正しい制御はRichTextBoxです。 RichTextBoxを使用しようとした当初の試みでは、最後のコンテンツ文字列を<Paragraph>..</Paragraph>要素に含めることができなかったと思います。 RichTextBoxは、Blockという要素のコレクションを保持しています(Paragraphなど)。

あなたの次のコードmodは動作します -

public class HighlightConverter : IValueConverter 
{ 
    ///<summary> 
    ///Converter class used to evaluate and highlight context string results 
    ///</summary> 
    /// 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string str = value.ToString(); 

     str = str.Replace("&", "&amp;"); 
     str = str.Replace("<fragment>", " "); 
     str = str.Replace("</fragment>", " "); 
     str = str.Replace("<hilight>", "<Run Foreground=\"Gold\" FontWeight=\"ExtraBold\" FontSize=\"13\">"); 
     str = str.Replace("</hilight>", "</Run>"); 

     str = "<RichTextBox xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><Paragraph>" 
      + str 
      + "</Paragraph></RichTextBox>"; 

     return XamlReader.Load(str); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

ところで、結合の上ごMode=TwoWayを落とし、それは必要ありません。

+0

アンソニーありがとうございますが、残念ながら私は段落タグを使用しました。コントロールをレンダリングしようとすると、次のエラーが表示されます。 'System.String'型のインスタンスを 'System.Windows.Documents.BlockCollection'型のコレクションに追加できません – rlcrews

0

私がこれを手助けしてくれたことで、アンソニーはクレジットを受け取ります。実際に私の問題は段落タグに関連していました。私は元々それらを挿入したが、私は間違った場所にそれらを持っていた。以下上場

は、更新されたコード

public class HighlightConverter : IValueConverter 
{ 
    ///<summary> 
    ///Converter class used to evaluate and highlight context string results 
    ///</summary> 
    /// 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string str = value.ToString(); 

     str = str.Replace("&", "&amp;"); 
     str = str.Replace("<fragment>", "<Paragraph>"); 
     str = str.Replace("</fragment>", "</Paragraph>"); 
     str = str.Replace("<hilight>", "<Run Foreground=\"Gold\" FontWeight=\"ExtraBold\" FontSize=\"13\">"); 
     str = str.Replace("</hilight>", "</Run>"); 
     return XamlReader.Load("<RichTextBox xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" TextWrapping=\"Wrap\" >" + str + "</RichTextBox>"); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

マイナスこれは素晴らしい作品UIはほとんどのフォーマットです。

関連する問題