13

私は単純なチャットアプリケーションに取り組んでいます。現在、メッセージは次のようなカスタム スタイルのリストボックスにバインドされています (簡略化された XAML)。

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

ここで、表示されるメッセージ テキストに画像 (グラフィカルなスマイリーなど) を挿入できるようにしたいと考えています。TextBlock (またはその他の標準コンポーネント) を使用してこれを達成する方法はありますか、それとも特別なコントロールを使用する必要がありますか?

前もって感謝します

4

6 に答える 6

55

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>
于 2011-04-07T23:42:23.323 に答える
4

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

于 2009-05-05T13:13:54.523 に答える
1

(絵文字のように)実際にテキストに画像が必要な場合は、いくつかの作業を行う必要があります。これは、私が実際にユーザーコントロールを必要とする数少ない回数のように聞こえます。そのポイントは、テキストをスキャンして絵文字の値を探し、その場でデータテンプレートを作成することです。

XAMLで実行できることはすべてコードで実行できることを忘れないでください。したがって、私が考えているコードは、次の一般的な考え方に従います。

  1. テキストをスキャンして絵文字の値を探し、データ要素の値のリストを作成します。
  2. DockPanelを作成します。
  3. リスト内の各要素に対して、TextBlockまたはImage(値に基づく)のいずれかを追加します。
  4. this.ContentをDockPanelに設定します。

このようなものが実際に探しているものだと思いますが、画像だけが必要な場合は、ValueConverterの提案が機能します。

于 2009-04-07T19:54:34.367 に答える
1

値コンバーターを使用して、テキストまたはスマイリー フェイスのいずれかで構成されるセグメントのリストを持つ別のタイプにテキストを変換できます (それらが表示される順序で)。

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

于 2009-04-07T19:34:23.697 に答える
1

私も最近この問題に遭遇しましたが、これを克服するために

ItemsPanelTemplate に WrapPanel を持つ ItemsControl を含む ListBox ItemTemplate を作成し、すべてのロジックを収容する IValueConverter を使用して、文字列を ItemsControl の ItemsSource にバインドします。

単語を分割し、絵文字文字列、ハイパーリンクなどをクエリ/検索し、TextBlock、Image、Hyperlink、Button 要素を作成し、値とイベント ハンドルを設定します。

この関数で List<UIElement> を作成し、生成したコントロールを List に入力し、IValueConverter の Convert 関数で List をオブジェクトとして返します。

そこに WrapPanel があるため、ラッピングが完了します。

于 2012-04-12T15:49:44.207 に答える
-1

TextBlock の代わりに Image 要素を使用し、Converter を使用してテキスト値を笑顔の画像にマップします。

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

于 2009-04-07T19:38:13.597 に答える