gpt4 book ai didi

c# - 基于 C# 中搜索文本框的文本将 ListView CollectionViewSource 滚动到一组项目

转载 作者:太空宇宙 更新时间:2023-11-03 13:17:32 25 4
gpt4 key购买 nike

我正在使用 XAML 和 C# 开发 Windows Phone 8.1 应用。

我有一个 ListView ,其项目源设置为名为 MusicSourceCollectionViewSource。在 C# 的后端,我有一个名为 sourceObservableCollection,下面的代码通过获取手机上的所有音乐文件来填充它,按艺术家分组,然后放入它们在 CollectionViewSource 中,在 ListView 中显示它们:

var folders = await folder.GetFoldersAsync();
if (folders != null)
foreach (var fol in folders)
await getMusic(fol);

var files = await folder.GetFilesAsync();
foreach (var file in files)
{
MusicProperties musicProperties = await file.Properties.GetMusicPropertiesAsync();
this.source.Add(new Music((musicProperties.Artist.Length > 0) ? musicProperties.Artist : "Custom", (musicProperties.Title.Length > 0) ? musicProperties.Title : file.Name, (musicProperties.Album.Length > 0) ? musicProperties.Album : "Custom Album", file.Path));
}
itemSource = AlphaKeyGroup<Music>.CreateGroups(source, CultureInfo.CurrentUICulture, s => s.Artist, true);
this.MusicSource.Source = itemSource;

以下是它的 XAML 方面:

<Page.Resources>
<DataTemplate x:Key="GroupTemplate">
<Grid Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="1">
<TextBlock x:Name="SongTitle" Text="{Binding Title}"
Style="{ThemeResource ListViewItemTextBlockStyle}"/>
<TextBlock x:Name="ArtistName" Text="{Binding Album}"
Style="{ThemeResource ListViewItemContentTextBlockStyle}"/>
</StackPanel>
</Grid>
</DataTemplate>

<CollectionViewSource x:Name="MusicSource" IsSourceGrouped="true" />

<DataTemplate x:Key="headerTemplate">
<StackPanel HorizontalAlignment="Stretch" Width="{Binding ActualWidth, ElementName=contentList}">
<TextBlock Text="{Binding Key}" />
</StackPanel>
</DataTemplate>
</Page.Resources>

<Grid>
<SemanticZoom>
<SemanticZoom.ZoomedInView>
<ListView
x:Name="contentList"
SelectionMode="Multiple"
ItemsSource="{Binding Source={StaticResource MusicSource}}"
ItemTemplate="{StaticResource GroupTemplate}">
<ListView.GroupStyle>
<GroupStyle HidesIfEmpty="True" HeaderTemplate="{StaticResource headerTemplate}"/>
</ListView.GroupStyle>
</ListView>
</SemanticZoom.ZoomedInView>
</SemanticZoom>
<Border
x:Name="SearchBorder"
Background="White">
<TextBox
x:Name="Search" TextChanged="TextBox_TextChanged" />
</Border>
</Grid>

所以我在 ListView 中得到如下内容:

迈克尔 jackson

  • 不好
  • 危险
  • 惊悚片

阿姆

  • 不害怕
  • 怪物

我有一个名为 search 的文本框,用于搜索 ListView 。

应该发生的是,当我在文本框中键入内容时, ListView 会滚动到最近的组,该组的组标题与文本框中的文本相匹配。因此,如果我键入“Em”, ListView 应立即向下滚动到项目的“Eminem”类别。

我将如何实现这一点?

此外,除了滚动到 songTitle 属性与文本框中文本的属性匹配的项目外,是否可以做同样的事情?

最佳答案

哇,这是一个难题。我过去做过类似的事情。基本上你想要一个 ObservableCollection 集的 AJAX 解决方案。您可以通过 AlphaKeyGroup 在正则表达式匹配的帮助下编写搜索函数来实现这一点。这应该返回它需要滚动到的元素。

至于搜索每个文本更改,您需要将 TextChanged 事件附加到文本框,如下所示:

<TextBox x:Name="my_search" TextChanged="my_search_TextChanged" Grid.Row="0" />

当它找到匹配项时,您想滚动到该元素

contentList.ScrollIntoView(matching_element);



好的,发布 Windows Phone 8.1 解决方案:ListView Searching Project

亮点包括添加到 GroupKey 类的搜索例程。

public T FindMatch(string pattern, GetKeyDelegate getKey)
{
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);

foreach (T item in this.Items)
{
string key = getKey(item);
Match match = rgx.Match(key);
if (match.Success)
return item;
}

return default(T);
}

Screen Shot of Searching For What what

关于c# - 基于 C# 中搜索文本框的文本将 ListView CollectionViewSource 滚动到一组项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25538411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com