Afficher des images dans TextBlock (WPF)
Je suis en train de travailler sur une simple application de chat. Actuellement, les messages sont liées à une coutume de style listbox comme ceci (XAML simplifiée):
<ListBox ItemsSource="{Binding MessageCollection}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Maintenant, je voudrais être en mesure de mettre des images (comme les émoticônes graphiques) dans l'affichage de message texte. Est-il possible de réaliser cela en utilisant TextBlock (ou tout autre standart composant) ou dois-je besoin d'utiliser certaines de contrôle spécial pour cela?
Merci d'avance
OriginalL'auteur lacop | 2009-04-07
Vous devez vous connecter pour publier un commentaire.
Si vous voulez que les Images en fait à l'intérieur de le texte (comme une émoticône), alors vous allez avoir à faire des travaux. Cela sonne comme une des rares fois où je veux en fait un Contrôle de l'Utilisateur, le point de ce qui serait celle qui analyse le Texte à la recherche pour émoticône valeurs et la construction d'un Modèle de Données à la volée.
Rappelez-vous que tout ce que vous pouvez faire dans le XAML, vous pouvez le faire dans le code, de sorte que le code je pense devrait suivre cette idée générale:
créer une liste de valeurs pour les données
éléments.
soit un TextBlock ou une Image
(basée sur la valeur).
Je pense que quelque chose comme cela, c'est effectivement ce que vous cherchez, mais si vous voulez juste une Image, puis de la ValueConverter suggestion serait de travailler.
C'est un bon point. Vous pourriez avoir à faire un peu de mesure et de briser le texte que nécessaire pour obtenir le bon effet enveloppant. Il ne devrait être un problème lors de l'une émoticône est présent.
De toute façon, je n'arrive pas à trouver une façon de le faire. J'ai créé la coutume de contrôle de l'utilisateur, mais je ne sais pas comment remplacer le rendu mécanisme et de le remplacer avec mon code émettant de la zone de texte/Image les éléments requis. Pouvez-vous me donner un indice s'il vous plaît?
Et depuis que j'ai besoin de faire les mesures, ne serait-il pas plus facile de rendre à la fois du texte et des images de moi-même? (En surchargeant la méthode de rendu et à l'aide des outils de dessin)
N'y pensez pas comme primordial le rendu mécanisme: c'est ce que nous faisons en WinForms. Ici, vous aurez simplement à ajouter des éléments à votre DockPanel: DockPanel panneau = new DockPanel(); panneau.Add(new TextBlock("value")); panneau.Add(new Image("source")); etc.
OriginalL'auteur Joel Cochran
Suffit d'utiliser la InlineUIContainer.
OriginalL'auteur Schulzer
Le Contenu d'un TextBlock est toujours juste une série de Inlines, vous devez donc utiliser la InlineUIContainer. Vous pouvez insérer ce conteneur comme l'un des Inlines dans votre TextBlock où vous souhaitez qu'une Image apparaît, en alternance avec des séquences de texte. Vous pourriez analyser un message et en même temps continuer à ajouter des jetons (soit du texte ou des images) que vous trouverez à la Inlines collection du TextBlock.
OriginalL'auteur PeterAllenWebb
Vous pouvez utiliser une valeur de convertisseur pour convertir le texte d'un autre type qui a une liste de segments qui sont composées de texte ou le smiley face (dans l'ordre dans lequel ils apparaissent).
Ensuite, vous pouvez utiliser un modèle de données à lier à ce nouveau type et afficher le texte et les visages souriants de façon appropriée.
OriginalL'auteur casperOne
J'ai aussi rencontré ce problème récemment et je surmonter cette par
La création d'une zone de liste ItemTemplate contenant un ItemsControl qui a un WrapPanel dans le ItemsPanelTemplate puis en liant ma chaîne à l'ItemsSource de la ItemsControl avec un IValueConverter que les maisons de la logique.
Séparer vos mots de requête et/recherche vos émoticônes cordes, liens hypertextes, etc et créer votre TextBlock, Image, lien Hypertexte, Bouton d'éléments et de l'ensemble de votre événement et les valeurs des poignées.
Dans la fonction créer une Liste<UIElement>, et remplir la Liste avec les contrôles que vous avez généré et retourner la Liste que l'objet de la fonction de conversion de la IValueConverter.
Parce que vous avez le WrapPanel de là, vous obtenez votre emballage fait.
OriginalL'auteur Christopher Leach
Utiliser l'élément de l'Image à la place du TextBlock et l'utilisation d'un Convertisseur de carte de la valeur de texte pour le sourire de l'image.
Le DataTemplace peut être tout ce que vous voulez. Par Exemple <DataTemplate> <Grid> <TexBlock .../> <Image .../> <...d'autres contrôles ...> </Grid> </DataTemplate>
OriginalL'auteur ema