如何在uwp的scrollviewer中从下到上获得垂直偏移?

问题描述

我希望在 uwp 中滚动查看器从底部到顶部而不是从顶部到底部的垂直偏移,因为它只显示从上到下,因为我从顶部增加应用程序的高度它不会工作,但是当我降低应用程序的高度时它会工作........请帮助我。

这是我的代码

double getvalue = scrollviewer.verticaloffset;
textblock.Text = getvalue.ToString();

获得价值但是当我增加应用程序的高度时它不起作用但是当我降低应用程序的高度时它显示一些价值。

当滚动条位于顶部时,它不会给出值………………请帮助我。

这里有一些截图

Image 1

当应用程序处于正常状态时,您可以在图 1 中看到。

Image 2

正如您在图 2 中看到的,当应用程序窗口高度较小时。

Image 3

正如您在图片 3 中看到的那样,当我向上滚动时,它会显示 Button。

Image 4

正如你在图 4 中看到的,当我增加应用程序的高度时,它并没有消失。

Image 5

正如你在图 5 中看到的,当我降低应用程序的高度时,它消失了。

请各位帮我实现这个功能

解决方法

根据图片和您的描述,我认为您的目的是创建一个用于让 ScrollViewer 滚动到顶部的按钮。问题是当您向上或向下滚动栏或调整窗口大小时,如何让按钮显示当 ScrollViewer’s 内容不在底部时,并在 ScrollViewer’s 内容不在时隐藏按钮每当您向上或向下滚动栏或调整窗口大小时,都会在底部。

您可以使用 VerticalOffset 属性表示内容垂直滚动的距离,ViewportHeight 属性表示可查看内容的垂直大小,ExtentHeight 属性表示垂直大小ScrollViewer 中所有可滚动的内容,判断 ScrollViewer 的内容是否到达底部。

请检查以下代码作为示例:

//MainPage.xaml
<Grid SizeChanged="Grid_SizeChanged">
    <ScrollViewer x:Name="scrollViewer" VerticalScrollBarVisibility="Visible" VerticalScrollMode="Enabled"
                  ViewChanged="scrollViewer_ViewChanged">
        <StackPanel x:Name="stackPanel" Background="LightGray">
            <TextBlock Text="0" Margin="20"/>
            <TextBlock Text="1" Margin="20"/>
            <TextBlock Text="2" Margin="20"/>
            <TextBlock Text="3" Margin="20"/>
            <TextBlock Text="4" Margin="20"/>
            <TextBlock Text="5" Margin="20"/>
            <TextBlock Text="6" Margin="20"/>
            <TextBlock Text="7" Margin="20"/>
            <TextBlock Text="8" Margin="20"/>
            <TextBlock Text="9" Margin="20"/>
            <TextBlock Text="10" Margin="20"/>
            <TextBlock Text="11" Margin="20"/>
            <TextBlock Text="12" Margin="20"/>
    </StackPanel>
    </ScrollViewer>

    <Button x:Name="BackButton" Content="top" Click="BackButton_Click" HorizontalAlignment="Center" VerticalAlignment="Bottom"/>
</Grid>

//MainPage.xaml.cs
private void BackButton_Click(object sender,RoutedEventArgs e)
{
    //The code is used to scroll to the top
    scrollViewer.ChangeView(null,null);

    //the code is used to scroll to the bottom
    //scrollViewer.ChangeView(null,scrollViewer.ExtentHeight-scrollViewer.ViewportHeight,null);
}

private void scrollViewer_ViewChanged(object sender,ScrollViewerViewChangedEventArgs e)
{
    var verticalOffset = scrollViewer.VerticalOffset;
    var extentHeight = scrollViewer.ExtentHeight;
    var viewportHeight = scrollViewer.ViewportHeight;
    if (viewportHeight + verticalOffset == extentHeight)
    {
        BackButton.Visibility = Visibility.Collapsed;
    }
    else
    {
        BackButton.Visibility = Visibility.Visible;
    }
}

private void Grid_SizeChanged(object sender,SizeChangedEventArgs e)
{
    var verticalOffset = scrollViewer.VerticalOffset;
    var extentHeight = scrollViewer.ExtentHeight;
    var viewportHeight = scrollViewer.ViewportHeight;
    if (viewportHeight + verticalOffset == extentHeight)
    {
        BackButton.Visibility = Visibility.Collapsed;
    }
    else
    {
        BackButton.Visibility = Visibility.Visible;
    }
}

如果您有任何其他问题,请随时与我联系。