Domanda

Sto lavorando a una semplice applicazione chat. Attualmente i messaggi sono binded ad una casella di riepilogo personalizzato in stile come questo (XAML semplificata):

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

Ora mi piacerebbe essere in grado di mettere le immagini (come gli smiley grafici) nel testo del messaggio visualizzato. Esiste un modo per raggiungere questo obiettivo utilizzando TextBlock (o qualsiasi altro componente standart) o ho bisogno di usare un certo controllo speciale per questo?

Grazie in anticipo

È stato utile?

Soluzione

Se si desidera che le immagini in realtà all'interno il testo (come un emoticon), allora si sta andando ad avere per fare un certo lavoro. Questo suona come una delle poche volte che sarebbe in realtà vuole un controllo utente, il punto di cui sarebbe uno che esegue la scansione del testo alla ricerca di valori emoticon e la costruzione di un modello di dati al volo.

Ricordate che qualsiasi cosa si può fare in XAML si può fare in codice, in modo che il codice che sto pensando di seguirebbe questa idea generale:

  1. testo di scansione per i valori emoticon e creare un elenco di valori per i dati elementi.
  2. Crea un DockPanel.
  3. elemento Foreach nella lista, aggiungi         o un TextBlock o un'immagine         (In base al valore).
  4. Imposta this.Content al DockPanel.

Credo che qualcosa di simile a questo è in realtà ciò che si sta cercando, ma se si desidera solo un immagine, quindi il suggerimento ValueConverter avrebbe funzionato.

Altri suggerimenti

Basta usare l'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>

Il contenuto di un TextBlock è sempre e solo una serie di Inlines, così si dovrebbe utilizzare l'InlineUIContainer. È possibile inserire questo contenitore come uno dei marcatori in linea il tuo TextBlock ovunque si desidera apparire di un'immagine, in alternanza con il testo Runs. Si potrebbe analizzare un messaggio e allo stesso tempo mantenere l'aggiunta di gettoni (testo o immagini) che si trovano alla raccolta Inlines del TextBlock.

È possibile utilizzare un convertitore di valori per convertire il testo in un altro tipo che ha una lista di segmenti che sono composti da testo o la faccina (nell'ordine in cui compaiono).

Quindi, è possibile utilizzare un modello di dati di legarsi a questo nuovo tipo e visualizzare il testo e faccine in modo appropriato.

Ho anche incontrato questo problema di recente e ho superato questo

La creazione di un ListBox ItemTemplate contenente un ItemsControl che ha un WrapPanel nel ItemsPanelTemplate e quindi vincolante la mia stringa al ItemsSource del ItemsControl con un IValueConverter che ospita tutta la logica.

Dividi le tue parole e Query / cercare i tuoi emoticon corde, collegamenti ipertestuali, ecc e creare i TextBlock, immagine, hyperlink, elementi Button e impostare i vostri valori e le maniglie di eventi.

Nella funzione di creare un List e popolare la lista con i controlli che avete generato e restituire la lista come l'oggetto nella funzione Convert del IValueConverter.

Perché avete la WrapPanel in là si ottiene il confezionamento fatto.

Utilizzare l'elemento immagine al posto del TextBlock e utilizzare un convertitore per mappare il valore di testo all'immagine sorriso.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top