1

これが私のXAMLコードです。現在、 2 つのesLongListSelectorが表示されています。と。TextBoxCityCountry

<DataTemplate x:Key="LongListSelectorItemTemplate">
    <ListBoxItem>
        <StackPanel Name="Address">
            <TextBlock Name="city" Text = "{Binding City}" />
            <TextBlock Name="country" Text="{Binding Country}"/>
        </StackPanel>
    </ListBoxItem>
</DataTemplate>

<TextBox Name="search"/>

SearchBox検索テキストによっては とがあり、 内のテキストを強調表示しLongListSelectorてから、他のコンテンツを除外する必要があります。これはまさに People / PhoneBook アプリケーションがデバイスでどのように機能するかです。

強調表示/フィルタリングを機能させることができましたが、次のような状況ではアイテムの順序が非常にランダムになります。

ロンドン
イギリス

デリー
インド

ニューヨーク
私たち

パリ
フランス

ハイライトの後、次のようになります。

ロンドン
インド

パリ
私たち

...

これまでの私のC#コードは次のとおりです。

void searchResults() {
    var filtereBlocks = RecurseChildren<StackPanel>(ListSelector)
        .Where(n => n.Name == "Address").ToList();

    foreach (var container in filtereBlocks) {
        bool ret1, ret2;
        TextBlock city = container.Children[0] as TextBlock,
               country = container.Children[1] as TextBlock;

        ret1 = Highlight(ref city, search.text); 
        ret2  = Highlight(ref country, search.text);
        if (!ret1 && !ret2) {
            city.visibility = System.Windows.Visibility.Collapsed;
            country.visibility = System.Windows.Visibility.Collapsed;
        }
    }
}

// Found on the Internet

IEnumerable<T> RecurseChildren<T>(DependencyObject root) where T : UIElement {
    if (root is T) {
        yield return root as T;
    }

    if (root != null) {
        var count = VisualTreeHelper.GetChildrenCount(root);
        for (var idx = 0; idx < count; idx++) {
            foreach (var child in RecurseChildren<T>(VisualTreeHelper.GetChild(root, idx))) {
                yield return child;
            }
        }
    }
}
4

0 に答える 0