WPF TextBlock mettre en évidence certaines parties basées sur la recherche d'condition
J'ai TextBlock qui a Inlines dynamicly ajouté à cela (en gros tas d'objets qui sont soit en italique ou en gras).
Dans mon application j'ai la fonction de recherche.
Je veux être en mesure de mettre en évidence TextBlock du texte qui est en cours de recherche pour.
En soulignant je veux dire de changer certaines parties du TextBlock couleur du texte (tout en gardant à l'esprit qu'il peut mettre en évidence plusieurs objets à la fois).
J'ai essayé cet exemple http://blogs.microsoft.co.il/blogs/tamir/archive/2008/05/12/search-and-highlight-any-text-on-wpf-rendered-page.aspx
Mais il semble très instable 🙁
Est-il une façon simple de résoudre ce problème?
OriginalL'auteur Daniil Harik | 2009-04-15
Vous devez vous connecter pour publier un commentaire.
Cette question est similaire à Comment faire pour afficher les résultats de recherche dans un WPF éléments de contrôle sont mis en évidence les termes de la requête
En réponse à cette question, je suis venu avec une approche qui utilise un IValueConverter. Le convertisseur prend un extrait de texte, formats il en valide balisage XAML, et utilise un XamlReader pour instancier le balisage dans le cadre des objets.
L'explication complète est assez longue, donc je l'ai posté sur mon blog: Mettant en évidence les Termes de la Requête dans un WPF TextBlock
OriginalL'auteur dthrasher
J'ai pris dthrasers répondre et a pris le besoin d'un analyseur XML. Il fait un très bon travail en expliquant les pièces en son blog, Cependant cela n'a pas besoin de moi pour ajouter toutes les bibliothèques additionnelles, voici comment je l'ai fait.
Étape, faire une classe de convertisseur:
Étape deux:
Au lieu d'un TextBlock utiliser un ContentBlock. Passer dans la chaîne (vous utilisé pour votre textBlock) pour le bloc de contenu, comme suit:
Étape trois:
Assurez-vous que le test que vous transmettez est segmenté avec
|~S~|
et|~E~|
. Et laissez-la mise en évidence de commencer!Notes:
Vous pouvez changer le style dans la course à déterminer en quoi et comment votre texte est mis en surbrillance
Assurez-vous d'ajouter votre Convertisseur de classe à votre espace de noms et de ressources. Cela peut aussi nécessiter une reconstruction de se mettre au travail.
OriginalL'auteur SyntaxRules
Par une étrange coïncidence, j'ai récemment écrit un article qui permet de résoudre le même problème. C'est un contrôle personnalisé qui a les mêmes propriétés qu'un TextBlock (de sorte que vous pouvez échanger pour un
TextBlock
partout où vous en avez besoin), et il a une Propriété que vous pouvez lier à appeléHighLightText
, et où la valeur deHighLightText
est trouvé dans le principalText
propriété (insensible à la casse), il est mis en évidence.Il était assez simple de contrôle de créer, et vous pouvez retrouver l'article ici:
WPF TextBlock Avec Recherche de Correspondance de Chaîne
Et le code complet comme une solution ici:
HighlightSearchMatchTextBlock (GitHub)
OriginalL'auteur Dean Chalk
J'ai eu un problème similaire - en essayant de mettre en œuvre une recherche de texte dans une charge de présentateurs que, fondamentalement, représente un rapport. Le rapport a été écrit à l'origine en une chaîne et nous de mettre à profit FlowDocumentViewer intégré ctrl-F - il n'est pas très bon et a quelques-uns bizarre, mais était suffisant.
Si vous voulez juste quelque chose comme ça vous pouvez effectuer les opérations suivantes:
Nous avons décidé d'aller pour une réécriture que le rapport est en phase avec le reste de la programmation, et fondamentalement chaque éditer les modifications, avoir à recréer l'intégralité du rapport, à chaque fois, signifie que c'est assez lent. Nous avons voulu améliorer ce en se déplaçant à une mise à jour de-la-bits-vous-avez-besoin-pour modèle, mais nécessaire pour avoir du modèle de vue (plutôt que de simplement une chaîne de caractères) pour être en mesure de le faire dans un façon saine! Nous avons voulu préserver la recherche de la fonctionnalité avant de retirer le rapport, cependant, et aller mieux et ont de mettre en évidence le "courant" de la position de recherche dans une couleur et d'autres résultats de recherche dans un autre.
Voici une version simplifiée de ma solution; une classe qui dérive de TextBlock qui ajoute une propriété de dépendance de Type HighlightingInformation. Je n'ai pas compris l'espace de noms et de l'usage qu'ils sont sensibles.
Le type de cette classe peuvent être liées à des utilisations de la méthode de mise à jour lorsque c'est le texte et la liste des faits saillants sont modifiés pour mettre à jour la liste des Pistes. Les faits saillants se ressembler à quelque chose comme ceci:
Pour produire la bonne collection phare est un autre problème, qui en gros, j'ai résolu par le traitement de la collecte des présentateurs comme un Arbre qui vous récursive de recherche pour le contenu - les nœuds feuilles sont ceux qui ont un contenu et d'autres nœuds ont des enfants. Si vous effectuez une recherche en profondeur d'abord, vous obtenez l'ordre que vous attendez. Vous pouvez simplement écrire un wrapper autour de la liste des résultats de garder une trace de la position. Im ne va pas à poster tout le code de ma réponse ici, il est de documenter la façon dont vous pouvez faire wpf n'multi-couleur de mise en surbrillance dans le MVP de style.
Je n'ai pas utilisé INotifyPropertyChanged ou CollectionChanged ici que nous n'avons pas besoin de modifications pour être multi-cast (par exemple, une participante a de multiples points de vue). Au départ, j'ai essayé de le faire par l'ajout d'un événement modifié de notification pour le Texte et l'autre pour une liste (vous avez également manuellement abonnez-vous à la INotifyCollectionChanged événement). J'ai eu des préoccupations au sujet des fuites de mémoire de l'événement, des cotisations, cependant, et le fait que les mises à jour pour le texte et le met en évidence n'est pas venu dans le même temps fait-il problématique.
Le seul inconvénient de cette approche est que les gens ne devraient pas se lier à la propriété Text de ce contrôle. Dans la vraie version, j'ai ajouté quelques vérifications + exception de lancer à empêcher les gens de le faire, mais oublié de l'exemple pour plus de clarté!
OriginalL'auteur JonnyRaa
Voici ce que j'ai trouvé en profitant de l'existant
TextBlock
et l'ajout d'une nouvelle propriété de dépendance nomméSearchText
:Et à votre avis, ce:
OriginalL'auteur MarcBalta
Ici, je présente une autre Approche pour la mise en évidence de texte. J'ai eu un cas d'utilisation où j'avais besoin pour décorer un tas de Code C#, WPF, cependant, je ne veux pas utiliser textBlock.Inlines.Ajoutez le type de syntaxe, au lieu de cela, je voulais générer la mise en évidence XAML à la volée, puis ajouter dynamiquement à une Toile ou tout autre contenant en WPF.
Supposons donc que vous voulez coloriser le morceau de code suivant et également mettre en valeur une partie de celui-ci:
Supposons que le code ci-dessus se trouve dans un fichier appelé Test.txt .
Supposons que vous voulez coloriser tous les C# mots-clés (public, static void etc..) et les types simples(int, string) en Bleu, et la Console.WriteLine mis en évidence en jaune.
L'étape 0. Créer une nouvelle Application WPF et comprennent un exemple de code similaire à ci-dessus dans un fichier appelé Test.txt
L'étape 1. Créer un Code Surligneur classe:
L'étape 2. Ajouter une Toile XAML tag à votre MainWindow.xaml
L'étape 3. Dans Votre Application WPF ajoutez le code suivant: (assurez-vous que test.txt est au bon endroit) :
OriginalL'auteur Alex Begun
Fini par écrire de code suivant
Au moment a quelques bugs, mais résout le problème
OriginalL'auteur Daniil Harik
Si vous êtes à la manipulation ContainerContentChanging pour votre ListViewBase, vous pouvez prendre les méthodes suivantes: TextBlock mise en évidence pour WinRT/ContainerContentChanging
Veuillez noter que ce code est pour Windows RT. WPF de la syntaxe légèrement différente. Notez également que si vous utilisez la liaison à remplir le TextBlock.Propriété de texte, le texte généré par mon approche sera écrasé. J'utilise ContainerContentChanging pour remplir les champs de cibles en raison de radicalement-augmentation de la performance et des améliorations dans l'utilisation de la mémoire, par rapport à la normale de liaison. J'utilise la liaison uniquement pour gérer les données de source, pas de la vue de données.
OriginalL'auteur Mark Jones