MISE À JOUR: J'élaboré de manière significative à ce sujet dans this blog post.
Je ne pense pas qu'il y ait un moyen facile de le faire, mais voici comment je résoudre ce problème:
- Définir un modèle de vue pour les éléments de la liste. Il devrait inclure des propriétés pour exposer le texte et définir quelle partie du texte devrait être mise en évidence (les index de début et de fin, fondamentalement).
- Lorsque l'utilisateur saisit du texte dans la zone de recherche, parcourez les modèles de vue et recherchez les correspondances dans le texte. Si une correspondance est trouvée, définissez les index de manière appropriée. Si une correspondance est introuvable, redéfinissez les index sur -1 ou tout ce qui ne correspond à aucune correspondance. À votre avis, définissez le
Background
du TextBlock
sur les index. Utilisez un convertisseur pour convertir les index en GradientBrush
qui est jaune vif (ou peu importe) entre les deux index.
Voilà comment Je pense que vous pouvez comprendre les dimensions des parties soulignées du TextBlock
:
- Obtenir un
TextPointer
via la propriété TextBlock.ContentStart
.
- Déplacez au début de la sélection en appelant
TextPointer.GetPositionAtOffset(indexOfStart)
en utilisant LogicalDirection.Forwards
.
- Déplacez-vous à la fin de la sélection en appelant
TextPointer.GetPositionAtOffset(indexOfStart)
en utilisant LogicalDirection.Backwards
.
- Appelez
TextPointer.GetCharacterRect
pour obtenir la bordure Rectangle
du contenu en surbrillance.
Pour être honnête, je ne suis pas sûr que ce dernier travail. Je devrais l'essayer pour moi-même, et je peux le faire pour un billet de blog.
EDIT: Juste eu le temps d'essayer par moi-même. Cela fonctionne vraiment, bien qu'avec de légères modifications à ma logique ci-dessus. Voici le code qui démontre.Voici une capture d'écran:
Screenshot http://img219.imageshack.us/img219/2969/searchx.png
Window1.xaml:
<Window x:Class="TextSearch.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1">
<StackPanel>
<TextBox x:Name="_searchTextBox"/>
<Grid>
<Path Fill="Yellow" Stroke="Black" StrokeThickness="0">
<Path.Data>
<RectangleGeometry x:Name="_rectangleGeometry"/>
</Path.Data>
</Path>
<TextBlock x:Name="_textBlock">Some sample text that you can search through by typing in the above TextBox.</TextBlock>
</Grid>
</StackPanel>
</Window>
Window1.xaml.cs:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
namespace TextSearch
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
_searchTextBox.TextChanged += _searchTextBox_TextChanged;
}
void _searchTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
var searchText = _searchTextBox.Text;
var index = _textBlock.Text.IndexOf(searchText);
if (index == -1)
{
_rectangleGeometry.Rect = Rect.Empty;
}
else
{
var textPointer = _textBlock.ContentStart;
textPointer = textPointer.GetPositionAtOffset(index + 1, LogicalDirection.Forward);
var leftRectangle = textPointer.GetCharacterRect(LogicalDirection.Forward);
textPointer = textPointer.GetPositionAtOffset(searchText.Length, LogicalDirection.Backward);
var rightRectangle = textPointer.GetCharacterRect(LogicalDirection.Forward);
_rectangleGeometry.Rect = new Rect(leftRectangle.TopLeft, rightRectangle.BottomRight);
}
}
}
}
Je pense que le code est assez auto explicatif. Évidemment, vous devrez étendre le concept à votre scénario particulier. Vous pouvez préférer tirer parti de la propriété Background
du TextBlock
combinée avec un DrawingBrush
ou GradientBrush
au lieu d'avoir le Path
distinct.
Faisable? Oui! ... Facile? Non!! – Micah
Pouvez-vous donner plus de détails sur les "parties de texte"? Correspond-il à un bloc de texte ou à un texte dans un bloc de texte? Si vous essayez de faire correspondre des parties d'un bloc de texte et de le mettre en surbrillance, vous ne pourrez pas le faire sans utiliser un texte au lieu d'un bloc de texte. S'il vous plaît donner plus de détails et peut-être un échantillon de votre xaml. – Micah
J'ai modifié ma question. S'il vous plaît jeter un oeil et faites le moi savoir. Merci pour votre effort :) –