C# ListView将ListViewHeaderItem保持在顶部

C# ListView将ListViewHeaderItem保持在顶部,c#,xaml,listview,header,uwp,C#,Xaml,Listview,Header,Uwp,我首先解释我想要实现的目标: 字母“A”是我的Listview中的一个ListViewHeaderItem。如果不滚动,列表顶部看起来是这样的 在我滚动ListViewHeaderItem“A”之后,它与其他项目一起向下移动- 但我如何才能实现标题作为第一项一直保持在顶部,直到带有ist子项的字母“B”出现?我想要实现的行为的一个例子是微软针对Windows10的官方“邮件”应用程序。它将日期时间保持在最上面,直到提前一天写好的电子邮件到来 我不知道这个问题是否已经存在,但我不知道它是如何命名的

我首先解释我想要实现的目标:

字母“A”是我的Listview中的一个ListViewHeaderItem。如果不滚动,列表顶部看起来是这样的

在我滚动ListViewHeaderItem“A”之后,它与其他项目一起向下移动- 但我如何才能实现标题作为第一项一直保持在顶部,直到带有ist子项的字母“B”出现?我想要实现的行为的一个例子是微软针对Windows10的官方“邮件”应用程序。它将日期时间保持在最上面,直到提前一天写好的电子邮件到来


我不知道这个问题是否已经存在,但我不知道它是如何命名的,我也不知道用谷歌搜索什么。

根据您的描述,我认为您需要的是分组列表视图。这里的要点是使用as
ItemsSource
和设置来指定组的显示方式。以下是一个简单的示例:

在XAML中

<Page.Resources>
    <CollectionViewSource x:Name="groupInfoCVS" IsSourceGrouped="True" />
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ListView ItemsSource="{Binding Source={StaticResource groupInfoCVS}}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Margin="15" Text="{Binding Path=Text}" />
            </DataTemplate>
        </ListView.ItemTemplate>
        <ListView.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <Grid Background="LightGray">
                            <TextBlock Margin="10" Foreground="Black" Text="{Binding Key}" />
                        </Grid>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </ListView.GroupStyle>
    </ListView>
</Grid>

在代码背后

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();

        List<TestDemo> list = new List<TestDemo>();

        for (int i = 0; i < 6; i++)
        {
            list.Add(new TestDemo { Key = "A", Text = $"Test A {i}" });
            list.Add(new TestDemo { Key = "B", Text = $"Test B {i}" });
        }

        var result = from t in list group t by t.Key;
        groupInfoCVS.Source = result;
    }
}

public class TestDemo
{
    public string Key { get; set; }
    public string Text { get; set; }
}
公共密封部分类主页面:第页
{
公共主页()
{
this.InitializeComponent();
列表=新列表();
对于(int i=0;i<6;i++)
{
添加(newtestdemo{Key=“A”,Text=$“testa{i}”);
添加(newtestdemo{Key=“B”,Text=$“Test B{i}”);
}
var结果=从列表组t中的t开始,按t键;
groupInfoCVS.Source=结果;
}
}
公共类测试演示
{
公共字符串密钥{get;set;}
公共字符串文本{get;set;}
}
它看起来像:


有关更多信息,请参阅GitHub中的和简单ListView示例。

根据您的描述,我认为您需要的是分组ListView。这里的要点是使用as
ItemsSource
和设置来指定组的显示方式。以下是一个简单的示例:

在XAML中

<Page.Resources>
    <CollectionViewSource x:Name="groupInfoCVS" IsSourceGrouped="True" />
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ListView ItemsSource="{Binding Source={StaticResource groupInfoCVS}}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Margin="15" Text="{Binding Path=Text}" />
            </DataTemplate>
        </ListView.ItemTemplate>
        <ListView.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <Grid Background="LightGray">
                            <TextBlock Margin="10" Foreground="Black" Text="{Binding Key}" />
                        </Grid>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </ListView.GroupStyle>
    </ListView>
</Grid>

在代码背后

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();

        List<TestDemo> list = new List<TestDemo>();

        for (int i = 0; i < 6; i++)
        {
            list.Add(new TestDemo { Key = "A", Text = $"Test A {i}" });
            list.Add(new TestDemo { Key = "B", Text = $"Test B {i}" });
        }

        var result = from t in list group t by t.Key;
        groupInfoCVS.Source = result;
    }
}

public class TestDemo
{
    public string Key { get; set; }
    public string Text { get; set; }
}
公共密封部分类主页面:第页
{
公共主页()
{
this.InitializeComponent();
列表=新列表();
对于(int i=0;i<6;i++)
{
添加(newtestdemo{Key=“A”,Text=$“testa{i}”);
添加(newtestdemo{Key=“B”,Text=$“Test B{i}”);
}
var结果=从列表组t中的t开始,按t键;
groupInfoCVS.Source=结果;
}
}
公共类测试演示
{
公共字符串密钥{get;set;}
公共字符串文本{get;set;}
}
它看起来像:


有关更多信息,请参阅GitHub中的和简单列表视图示例

请参阅我对这个问题的评论,因此基本上,在出现标题之前,标题将保持不变。一旦你的“B”;出现时,用B更新标题,向下滚动时,用A更新。@AVKNaidu您建议将当前标题从正在更新值的listview中删除。这在某些情况下是好的,但我想达到原来的行为-它也有一个很酷的annimation…请描述你的情况,并在现有的应用程序中给出一个例子。这类似于已安装应用程序的列表?请参阅我对这个问题的评论,因此基本上,在出现标题之前,标题将保持不变。一旦你的“B”;出现时,用B更新标题,向下滚动时,用A更新。@AVKNaidu您建议将当前标题从正在更新值的listview中删除。这在某些情况下是好的,但我想达到原来的行为-它也有一个很酷的annimation…请描述你的情况,并在现有的应用程序中给出一个例子。它类似于已安装应用程序的列表?