这是我的 XAML 代码。目前,LongListSelector
正在显示两个TextBox
es;City
和Country
。
<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;
}
}
}
}