1

这是我的 XAML 代码。目前,LongListSelector正在显示两个TextBoxes;CityCountry

<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