2009-04-07 24 views
9

私は簡単なチャットアプリケーションに取り組んでいます。現在のメッセージは、このようなカスタムスタイルのリストボックス(簡体XAML)にバインドされています。TextBlock(WPF)で画像を表示

<ListBox ItemsSource="{Binding MessageCollection}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

今私は、表示されるメッセージのテキストに(グラフィカルスマイリーのような)画像を置くことができるようにしたいと思います。 TextBlock(または他のスタンドアットコンポーネント)を使用してこれを達成する方法はありますか?またはこれに特別なコントロールをいくつか使用する必要がありますか?あなたはテキストまたは(表示されている順序で)スマイリーフェイスのいずれかで構成されているセグメントのリストを持っている別の型にテキストを変換する値コンバーターを使用することができ、事前

答えて

1

あなたは写真の(絵文字のような)、実際に内のテキストをしたい場合は、いくつかの作業をしなければならないとしています。これは、私が実際にユーザーコントロールをしたいと思う数回のうちの1つのように聞こえます。そのポイントは、テキストをスキャンして顔文字の値を探して、その場でデータテンプレートを構築するものです。

XAMLで何かできることは、あなたがコードで実行できることに注意してくださいので、私はと思っていたコードは、この一般的なアイデアをたどる:

  1. スキャン絵文字値のテキストと は、値のリストを作成しますデータの場合 要素。
  2. DockPanelを作成します。
  3. ListのForeach要素には、 TextBlockまたはImage (値に基づく)のいずれかを追加します。
  4. これをDockPanelに設定します。

私はこれが実際にあなたが探しているものだと思いますが、あなたがImageだけを望むならば、ValueConverterの提案はうまくいくでしょう。

+0

のために私はこれが好きで、かなり簡単に聞こえます。しかし、私はテキストラッピングについて心配しています...私はそれを実装しようとし、それがどのように動作するか見てみましょう。ありがとう。 – lacop

+0

それは良い点です。正しい折り返し効果を得るには、測定を行い、必要に応じてテキストを分割する必要があります。顔文字が存在する場合にのみ問題になるはずです。 –

+0

とにかく、私はこれを行う方法を見つけることができないようです。私はカスタムのユーザーコントロールを作成しましたが、レンダリングメカニズムをオーバーライドして、必要に応じてコードをTextBox/Image要素に書き出す方法に置き換える方法がわかりません。私にヒントをお願いしますか? – lacop

1

感謝。

次に、データテンプレートを使用してその新しいタイプにバインドし、テキストとスマイリーの顔を適切に表示できます。

+0

もう少し詳しく説明してください(またはdocs/sampleにリンクしてください)。私は最初の部分を理解していると思いますが、2つの異なるデータ型を異なる要素にどのようにマッピングするのか分かりません。 – lacop

-1

TextBlockの代わりにImage要素を使用し、Converterを使用してテキスト値をスマイルイメージにマップします。

<ListBox ItemsSource="{Binding MessageCollection}"> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Image Source="{Binding Text, Converter={StaticResource MyImageConverter}}"/> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

+0

しかし、これはメッセージの画像のみを許可します。私が望むのは、1つのメッセージにテキストと画像を組み合わせたものです。 – lacop

+0

DataTemplaceは、必要なものすべてになります。例 <...他のコントロール...> ema

3

TextBlockのコンテンツは、常に一連のインラインであるため、InlineUIContainerを使用する必要があります。このコンテナは、画像を表示する場所、テキストの実行と交互に、TextBlock内のインラインの1つとして挿入できます。メッセージを解析すると同時に、見つかったトークン(テキストまたは画像のいずれか)をTextBlockのInlinesコレクションに追加し続けることができます。

31

InlineUIContainerを使用してください。

<TextBlock TextWrapping="Wrap"> 
    <Run>Some text.</Run> 
    <InlineUIContainer> 
     <Image Source="http://sstatic.net/stackoverflow/img/apple-touch-icon.png" Height="20"></Image> 
    </InlineUIContainer> 
    <Run>Some more text.</Run> 
</TextBlock> 
1

私も最近、この問題が発生したため、私はItemsPanelTemplateでWrapPanelを持っているのItemsControlを含むItemTemplateにリストボックスを作成し、その後でのItemsControlののItemsSourceに私の文字列を結合

することによってこれを克服しますすべてのロジックを格納するIValueConverter。

あなたの言葉を分割して、あなたの顔文字列、ハイパーリンクなどを検索して検索し、TextBlock、画像、ハイパーリンク、ボタン要素を作成し、値とイベントハンドルを設定します。

< UIElement>を作成し、生成したコントロールをListに挿入し、IValueConverterの変換機能でオブジェクトとしてリストを返します。

あなたにはWrapPanelがあるので、ラッピングが完了します。