[WPFカスタムコントロールライブラリ]は、ソート、フィルタリングおよびハイライト

1.のリストを見つけるために、簡単にコンテンツを作成する方法

そのようなリスト(ローカルデータソース)は、困難であり得るこれらの所望のデータのいずれかを見つけるためにできるだけ多くのコンテンツが存在すると仮定する。このリストを最適化するために、ソート、フィルタリングおよび強調表示に過ぎません。

上記の変換の結果。

2.ソート

WPFであり、例えばLINQのために、データの並べ替えを達成するための多くの機能がありますが、このようなシナリオでは、使用する標準的な方法であるCollectionViewSourceを

CollectionViewSourceこれは、データセットへのプロキシクラスです。これは、2つの非常に重要なプロパティがあります。

それは見て、データベースは、表ビューの関係ではありません同じように感じている、と?

この例で使用しCollectionViewSource、次のようにソートのコードは次のとおりです。

private readonly CollectionViewSource _viewSource;

public HighlightSample()
{
    InitializeComponent();
    _viewSource = new CollectionViewSource
    {
        Source = Employee.AllExecutives
    };

    _viewSource.View.Culture = new System.Globalization.CultureInfo("zh-CN");
    _viewSource.View.SortDescriptions.Add(new SortDescription(nameof(Employee.FirstName), ListSortDirection.Ascending));
    EmployeeElement.ItemsSource = _viewSource.View;
}

このコードはあるCollectionViewSourceにソースの割り当てCollectionViewSourceデータソースとしてのListBoxを表示。前記SortDescriptionsビューを記述するためには、ソートされました。あなたが中国を含める場合は、することを忘れないでくださいCulture設定zh-cn

この時点で、機能の並べ替えを実現しています。ドキュメントも言及しCollectionViewSource、他の情報を:

すべてのトップレベルの基礎となるソースコレクション自体の操作なしにクエリをフィルタリングし、グループ化、コレクションベースのソートをナビゲートし、表示するために使用することができるバインディングソースコレクションとしてコレクションを見ることができます。ソース実装がINotifyCollectionChanged場合はインターフェイスの変更は、見るために広がって、CollectionChangedイベントを発生させました。

ビューは、ソースを変更しないので、そのそれぞれが複数の関連付けビューのソースを持つことができます。ビューを使用して、あなたはさまざまな方法で同じデータを表示することができます。例えば、ページの左側にタスク優先度の種類を表示することが望ましいこと、および右ページ領域によってグループ化されたタスクが表示されてもよいです。

3.スクリーニング

CollectionViewSourceビューの属性タイプするICollectionView提供インターフェース、フィルタのフィルタリングを実装するためのプロパティデータを。この例では、次のことを達成するために:

_viewSource.View.Filter = (obj) => (obj as Employee).DisplayName.ToLower().Contains(FilterElement.Text);

private void OnFilterTextChanged(object sender, TextChangedEventArgs e)
{
    if (_viewSource != null)
        _viewSource.View.Refresh();
}

このコードは、テキスト入力ボックスは、機能を変更するには、リフレッシュビューを実装します。どこリフレッシュ方法は、ビューを再作成するために使用され、それは、ビューを更新しています。

ICollectionViewまた、提供DeferRefreshのオートリフレッシュに組み込まれた遅延を表示および変更するために使用することができる遅延ループを入力するために使用される機能を、リフレッシュ動作は、大量のデータを設定するには、この関数を複数使用を必要とするかもしれません。

4.ハイライト

<TextBox x:Name="FilterElement"
         TextChanged="OnFilterTextChanged"/>
<ListBox Name="EmployeeElement"
         Grid.Row="1"
         Height="200"
         Margin="0,8,0,0">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding DisplayName}"
                           kino:TextBlockService.HighlightText="{Binding ElementName=FilterElement,Path=Text}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

UWPが使用できるハイライトTextHighlighterこのクラスは、実装が簡単です。WPFのハイライトは、使用されTextBlockService.HighlightTextたテキストをハイライトし、治療のTextBlockのテキストを置き換えるために、追加の属性宣言Inlines、上記のように使用します。

private static void MarkHighlight(TextBlock target, string highlightText)
{
    var text = target.Text;
    target.Inlines.Clear();
    if (string.IsNullOrWhiteSpace(text))
        return;

    if (string.IsNullOrWhiteSpace(highlightText))
    {
        target.Inlines.Add(new Run { Text = text });
        return;
    }

    while (text.Length > 0)
    {
        var runText = string.Empty;
        var index = text.IndexOf(highlightText, StringComparison.InvariantCultureIgnoreCase);
        if (index > 0)
        {
            runText = text.Substring(0, index);
            target.Inlines.Add(new Run { Text = runText, Foreground = _noHighlightBrush });
        }
        else if (index == 0)
        {
            runText = text.Substring(0, highlightText.Length);
            target.Inlines.Add(new Run { Text = runText });
        }
        else if (index == -1)
        {
            runText = text;
            target.Inlines.Add(new Run { Text = runText, Foreground = _noHighlightBrush });
        }

        text = text.Substring(runText.Length);
    }
}

これは、実装コードです。実際には、とのRegex.Splitコードの多くは良いが、見ているが、変更するのが面倒になります。
ハイライト一致するテキストになるはずだったが、実際の使用が一致するテキストがグレー表示されている見つけ、より良い見ていない、それはとても本当です。

5.まとめ

この記事では、使用説明CollectionViewSource実現のソート、フィルタリング機能と追加のプロパティの使用をしてInlines強調表示を実現します。

しかし、この実現には問題があるの強調表示:あなたはどうか、コードまたはXAMLで、ハイライト(または低い光)の色を定義することはできません。1つの可能なアプローチは、このような追加の属性の参照ToolTipServiceロットを定義することです。

<TextBox x:Name="FilterElement" 
         ToolTipService.ToolTip="Filter Text"
         ToolTipService.HorizontalOffset="10"
         ToolTipService.VerticalOffset="10"
         TextChanged="OnFilterTextChanged"/>

このアプローチの欠点は、追加のプロパティコードの多くは非常に複雑で保守が困難になる原因となることができるということです。ツールヒントToolTipServiceは、クラス、追加のプロパティの値にクラスを作成することができます。

<TextBox x:Name="FilterElement" 
         TextChanged="OnFilterTextChanged">
    <ToolTipService.ToolTip>
        <ToolTip Content="Filter Text"
                 HorizontalOffset="10" 
                 VerticalOffset="10"/>
    </ToolTipService.ToolTip>
</TextBox>

この方法では、保守が容易であるが、一部の人々は理解していない可能性がToolTipService.ToolTipプロパティの値が(例えば画像やその他のコンテンツなど)、テキスト、およびツールヒントの種類をすることができ、なぜ、どのようにXAMLを識別するためのいずれかになります。この時点次の記事で私が説明し、そのようなスタイルなどの機能をサポートするための機能を強調再実装します。

参照してくださいSearchableTextBlockきっぱりと、強調表示されたテキストボックスを作成しますが、私はこの興味深い機能により、マルチいくつかの知識を紹介することを願っています。

6.参照

CollectionViewSourceクラス(System.Windows.Data)マイクロソフトのドキュメント

TextBlock.Inlinesプロパティ(System.Windows.Controls)マイクロソフトのドキュメント

ハイライトWPFとWPFのTextBlockコントロール検索可能

7.ソース

マスターでTextBlockService.cs

おすすめ

転載: www.cnblogs.com/dino623/p/sort_filter_highlight.html