これが私のXAMLコードです。現在、 2 つのesLongListSelector
が表示されています。と。TextBox
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;
}
}
}
}