WPF如何在用户向下滚动后始终将控件置于顶部并保持在视图中

时间:2017-12-18 14:07:11

标签: c# wpf

我正在使用WPF构建垂直时间轴应用,如下所示: enter image description here

该应用分为两个方面,左侧是圆圈中的日期,右侧是详细信息。

让我们在屏幕上说我左边只能看到2个圆圈,而右边则是一些很长的细节。我想要实现的是,当我向下滚动时,第一个圆圈上升到屏幕,然后卡在顶部而不是离开我的视线。

就像Android上的Telegram一样,无论用户向上或向下滚动,发送者的显示图片总是在顶部,直到下一个发件人的显示图片进入。

我希望我能够清楚地解释自己。我已经设法在WPF中创建应用程序,现在我想进行上面提到的增强,但我不知道从哪里开始。

编辑: 这里有两张图片来解释我想要实现的目标。

向下滚动

Before scrolling down

向下滚动

After scrolling down

1 个答案:

答案 0 :(得分:0)

我能想到的最简单的解决方案是使用HeaderedItemsControl。这样您就可以将顶部项目设置为标题,将所有其他项目设置为列表项目。

 <Grid>

        <HeaderedItemsControl>
            <HeaderedItemsControl.Template>
                <ControlTemplate TargetType="{x:Type HeaderedItemsControl}">
                    <Border>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="Auto" />
                                <RowDefinition />
                            </Grid.RowDefinitions>
                            <ContentPresenter ContentSource="Header" />
                            <!--<Separator Grid.Row="1" />-->
                            <ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Visible">
                                <ItemsPresenter />
                            </ScrollViewer>
                        </Grid>
                    </Border>
                </ControlTemplate>
            </HeaderedItemsControl.Template>
            <HeaderedItemsControl.Header>Mark</HeaderedItemsControl.Header>
            <HeaderedItemsControl.Items>
                <system:String>Mark2</system:String>
                <system:String>Mark3</system:String>
                <system:String>Mark4</system:String>
                <system:String>Mark5</system:String>
                <system:String>Mark6</system:String>
                <system:String>Mark7</system:String>
                <system:String>Mark7</system:String>
            </HeaderedItemsControl.Items>
        </HeaderedItemsControl>
    </Grid>