0

に多数のアイテムがあるアプリを開発していListBoxます。

TextBoxユーザーがフィルターを入力すると結果が得られるように、TextBoxListBox使用して検索を作成したいと考えています。

4

2 に答える 2

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の項目に対して を定義しますListBox。これDataTemplateContentPresenter、定義されたコンバーターによってコンテンツが設定される を使用します。

<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>
于 2012-07-20T08:54:28.453 に答える
0

CollectionViewSource を使用すると、フィルタリングと検索に非常に役立ちます。

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

于 2012-07-20T10:26:14.873 に答える