2012-07-20 49 views

回答

1

我曾經爲WPF應用程序編寫過類似的功能。搜索到的文本應突出顯示DataGrid的項目。所有你需要的是一個MultiValueConverter,它將您的項目和搜索文本的文本轉換爲一個新的TextBlock,其中包含Run元素與突出顯示的部分。

轉換

轉換器將文本與搜索文本到TextBlock實例,其中包含以限定的風格比賽Run元素轉換。在你

public class TextToHighlightedTextConverter : IMultiValueConverter 
{ 
    public Style HighlightedTextStyle { get; set; } 

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values.Length > 0) 
     { 
      if (values.Length > 1) 
      { 
       var text = values[0] as string; 
       var searchText = values[1] as string; 
       if (!string.IsNullOrEmpty(text) && !string.IsNullOrEmpty(searchText)) 
       { 
        var textParts = GetSplittedText(text, searchText); 
        var textBlock = new TextBlock(); 
        foreach (string textPart in textParts) 
        { 
         textBlock.Inlines.Add(textPart.Equals(searchText, StringComparison.OrdinalIgnoreCase) 
                ? new Run(textPart) {Style = HighlightedTextStyle ?? new Style()} 
                : new Run(textPart)); 
        } 
        return textBlock; 
       } 
      } 
      return values[0]; 
     } 
     return null; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    private IEnumerable<string> GetSplittedText(string text, string searchText) 
    { 
     IList<string> textParts = new List<string>(); 
     if (string.IsNullOrEmpty(searchText)) 
     { 
      if (text.Length > 0) 
      { 
       textParts.Add(text); 
      } 
     } 
     else 
     { 
      while (text.Length > 0) 
      { 
       int searchIndex = text.IndexOf(searchText, StringComparison.OrdinalIgnoreCase); 
       if (searchIndex > -1) 
       { 
        if (searchIndex > 0) 
        { 
         string textInFrontOfMatch = text.Substring(0, searchIndex); 
         textParts.Add(textInFrontOfMatch); 
        } 
        textParts.Add(text.Substring(searchIndex, searchText.Length)); 
        text = text.Remove(0, searchIndex + searchText.Length); 
       } 
       else 
       { 
        textParts.Add(text); 
        text = string.Empty; 
       } 
      } 
     } 
     return textParts; 
    } 
} 

轉換器定義XAML文件

在XAML文件中定義你的轉換器,並設置應該用於比賽的風格。

<Converters:TextToHighlightedTextConverter x:Key="TextToHighlightedTextConverter"> 
    <Converters:TextToHighlightedTextConverter.HighlightedTextStyle> 
     <Style TargetType="{x:Type Run}"> 
      <Setter Property="Background" Value="Orange" /> 
     </Style> 
    </Converters:TextToHighlightedTextConverter.HighlightedTextStyle> 
</Converters:TextToHighlightedTextConverter> 

爲您的列表框

轉換器的使用您可以定義爲您的ListBox的項DataTemplate。此DataTemplate使用ContentPresenter,其內容將由定義的轉換器設置。

<ListBox ItemsSource={Binding YourItemsSource}> 
    <ListBox.ItemsTemplate> 
     <DataTemplate> 
      <ContentPresenter> 
       <ContentPresenter.Content> 
        <MultiBinding Converter="{StaticResource TextToHighlightedTextConverter}"> 
         <MultiBinding.Bindings> 
          <Binding /> 
          <Binding Path="YourSearchTextSource" /> 
         </MultiBinding.Bindings> 
        </MultiBinding> 
       </ContentPresenter.Content> 
      </ContentPresenter> 
     </DataTemplate> 
    </ListBox.ItemsTemplate> 
</ListBox> 
+0

謝謝。但我覺得CollectionViewSource會更好地滿足我的需求。 – user1538895 2012-07-22 07:00:03

0

使用CollectionViewSource其過濾和搜索非常有用:

Reffer: http://www.geoffhudik.com/tech/2010/10/14/wp7-in-app-searching-filtering.html

+0

謝謝!這篇文章幫了我很多。我在我的項目中嘗試了它。 – user1538895 2012-07-22 06:58:58

+0

@ user1538895:如果它可以幫助你..請放棄投票回答。:) – Mahantesh 2012-07-23 10:58:08

+0

我不能。因爲我的聲望小於15.我是新的stackoverflow。抱歉 – user1538895 2012-07-24 11:08:26

相關問題