2010-05-24 19 views
5

मेरे पास डेटा संग्रह एकत्र करने के लिए एक टेक्स्टबॉक्स और एक सूची बॉक्स है। एक सूची बॉक्स के अंदर एक पाठ खोजते समय यदि मिलान करने वाली स्ट्रिंग सूची में कहीं भी पाई जाती है तो इसे बोल्ड के साथ ग्रीन रंग में दिखाना चाहिए।किसी सूची बॉक्स के अंदर मिलान उप-तारों को हाइलाइट करने के लिए कैसे करें?

उदाहरण के लिए। मेरे पास स्ट्रिंग संग्रह है जैसे "निर्भरता संपत्ति, कस्टम संपत्ति, सामान्य संपत्ति"। यदि मैं खोज टेक्स्ट बॉक्स "प्रोप" टाइप करता हूं तो तीनों "प्रोप" (केवल शब्द प्रो) के साथ बोल्ड में होना चाहिए और इसका रंग हरे रंग में होना चाहिए। कोई विचार यह कैसे किया जा सकता है?

डेटाबॉक्स के अंदर डेटा डेटा टेम्पलेट का उपयोग करके दर्शाया गया है।

उत्तर

8

मैंने एक हाइलाइट टेक्स्टक्वियर बनाया है जिसे आप अपनी सूची आइटम टेम्पलेट्स के भीतर टेक्स्टब्लॉक से जोड़ सकते हैं (आपको System.indows.Interactivity को आपके प्रोजेक्ट में संदर्भ जोड़ना होगा)। आप जिस व्यवहार को हाइलाइट करना चाहते हैं उसमें एक संपत्ति को व्यवहार से बांधें, और यह बाकी है।

फिलहाल, यह केवल स्ट्रिंग के पहले उदाहरण को हाइलाइट करता है। यह भी मानता है कि टेक्स्ट पर कोई अन्य प्रारूपण लागू नहीं है।

<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

दिलचस्प:

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; } } } 

यहाँ कैसे आप इसका इस्तेमाल का एक उदाहरण है। प्रकाश के लिए Thnx। –

संबंधित मुद्दे

 संबंधित मुद्दे