2010-05-24 12 views
5

Mam jedno pole tekstowe i jeden listbox do wyszukiwania w zbiorze danych. Podczas wyszukiwania tekstu w polu Listbox, jeśli pasujący ciąg znajduje się w dowolnym miejscu na liście, powinien on być wyświetlany w kolorze zielonym z pogrubieniem.Jak podświetlić pasujące pod-łańcuchy w ListBox?

np. Mam kolekcję ciągów takich jak "Właściwość zależności, własność niestandardowa, właściwość normalna". Jeśli wpiszesz w polu tekstowym "prop" wszystkie trzy z "prop" (tylko słowo Prop) powinny być wytłuszczone, a jego kolor powinien być zielony. Każdy pomysł, jak to zrobić ?.

Dane wewnątrz listy są reprezentowane za pomocą DataTemplate.

Odpowiedz

8

Utworzyłem HighlightTextBehavior, który można dołączyć do TextBlock w szablonach pozycji na liście (musisz dodać odwołanie do System.Windows.Interactivity do swojego projektu). Przywiązujesz zachowanie do właściwości zawierającej tekst, który chcesz podświetlić, i robi resztę.

W tej chwili podświetla tylko pierwszą instancję łańcucha. Zakłada się także, że nie ma żadnego innego formatowania zastosowanego do tekstu.

using System.Linq; 
using System.Text; 
using System.Windows.Interactivity; 
using System.Windows.Controls; 
using System.Windows; 
using System.Windows.Documents; 
using System.Windows.Media; 

namespace StringHighlight 
{ 
    public class HighlightTextBehavior : Behavior<TextBlock> 
    { 
     public string HighlightedText 
     { 
      get { return (string)GetValue(HighlightedTextProperty); } 
      set { SetValue(HighlightedTextProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for HighlightedText. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty HighlightedTextProperty = 
      DependencyProperty.Register("HighlightedText", typeof(string), typeof(HighlightTextBehavior), new UIPropertyMetadata(string.Empty, HandlePropertyChanged)); 

     private static void HandlePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
     { 
      (sender as HighlightTextBehavior).HandlePropertyChanged(); 
     } 

     private void HandlePropertyChanged() 
     { 
      if (AssociatedObject == null) 
      { 
       return; 
      } 

      var allText = GetCompleteText(); 

      AssociatedObject.Inlines.Clear(); 

      var indexOfHighlightString = allText.IndexOf(HighlightedText); 

      if (indexOfHighlightString < 0) 
      { 
       AssociatedObject.Inlines.Add(allText); 
      } 
      else 
      { 
       AssociatedObject.Inlines.Add(allText.Substring(0, indexOfHighlightString)); 
       AssociatedObject.Inlines.Add(new Run() { 
        Text = allText.Substring(indexOfHighlightString, HighlightedText.Length), 
        Foreground = Brushes.Green, 
        FontWeight = FontWeights.Bold }); 
       AssociatedObject.Inlines.Add(allText.Substring(indexOfHighlightString + HighlightedText.Length)); 
      } 
     } 

     private string GetCompleteText() 
     { 
      var allText = AssociatedObject.Inlines.OfType<Run>().Aggregate(new StringBuilder(), (sb, run) => sb.Append(run.Text), sb => sb.ToString()); 
      return allText; 
     } 
    } 
} 

Oto przykład tego, jak go używać:

<Window x:Class="StringHighlight.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
     xmlns:b="clr-namespace:StringHighlight" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.Resources> 
      <x:Array x:Key="MyStrings" Type="{x:Type sys:String}"> 
       <sys:String>This is my first string</sys:String> 
       <sys:String>Another string</sys:String> 
       <sys:String>A third string, equally imaginative</sys:String> 
      </x:Array> 
     </Grid.Resources> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <TextBox x:Name="SearchText"/> 

     <ListBox Grid.Row="1" ItemsSource="{StaticResource MyStrings}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Grid.Row="1" Text="{Binding}"> 
         <i:Interaction.Behaviors> 
          <b:HighlightTextBehavior HighlightedText="{Binding ElementName=SearchText, Path=Text}"/> 
         </i:Interaction.Behaviors> 
        </TextBlock> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 
</Window> 
+0

Interesujące. Ruszaj po światło. –

Powiązane problemy