向下滚动提示到 Xamarin 中的 ScrollView

Scroll Down Prompt to ScrollView in Xamarin

我想在我的 Xamarin 应用程序中向 ScrollView 添加向下滚动提示,为此我遵循了这个 article .

它实际上做的是它在Scrollview之外添加了一个向下滚动指示器(Label),所以如果文本超过它显示此指示的页面大小,写为“向下滚动查看更多!”,当完全滚动到末尾时,它会隐藏此指示。

这部分工作正常,但如果文本少于页面,它仍然显示向下滚动指示器。

我想如果文本小于页面,向下滚动指示器的可见性应该是 false。

.xaml

<Grid>
    <ScrollView x:Name="MyScrollView" Scrolled="MyScrollView_Scrolled">
        <StackLayout>
            <BoxView BackgroundColor="Red"         HeightRequest="128"/>
            <BoxView BackgroundColor="Orange"      HeightRequest="128"/>
        </StackLayout>
    </ScrollView>
    <Label x:Name="ScrollDownIndicator"
               Text="Scroll down for more!"
               BackgroundColor="Black"
               TextColor="White"
               FontSize="Large"
               HorizontalTextAlignment="Center"
               VerticalOptions="End"/>
</Grid>

.xaml.cs

private void MyScrollView_Scrolled(object sender, ScrolledEventArgs e)
{
    double spaceAvailableForScrolling = MyScrollView.ContentSize.Height - MyScrollView.Height;
    double buffer = 32;
    ScrollDownPrompt.IsVisible = spaceAvailableForScrolling > e.ScrollY + buffer;
}

经过反复研究您的代码,我找到了一个可以让您到达所需位置的解决方案。

只是在寻找解决方法?去阅读 解决方案 部分。如果您想知道原因,请继续阅读解释部分。


解决方案

首先,我意识到在您发布的代码中 Xaml 文件中的 Label 被称为 ScrollDownIndicator,但在事件处理程序中,您正在更改一个名为 ScrollDownPrompt 的变量。在我的测试中,我继续将两个名字相等...

在您的 .xaml.cs 文件中,将以下行添加到您的页面构造函数中:

public MainPage()
{
  InitializeComponent();

  MyScrollView.PropertyChanged += (s, a) =>
  {
    if (a.PropertyName == ScrollView.ContentSizeProperty.PropertyName)
    {
      double buffer = 32;
      double spaceAvailableForScrolling = MyScrollView.ContentSize.Height - MyScrollView.Height;

      ScrollDownIndicator.IsVisible = spaceAvailableForScrolling > buffer;
    }
  };
}

private void MyScrollView_Scrolled(object sender, ScrolledEventArgs e)
{

  double spaceAvailableForScrolling = MyScrollView.ContentSize.Height - MyScrollView.Height;
  double buffer = 32;
  ScrollDownPrompt.IsVisible = spaceAvailableForScrolling > e.ScrollY + buffer;

}

说明

在您的代码中,您仅更改事件处理程序 指标 的可见性:MyScrollView_Scrolled。如果不执行滚动,则不调用事件处理程序并且不检查指示器的可见性:它只是始终可见。

要纠正此行为,您必须在 ScrollView 的 ContentSize 属性 更改时检查可见性。

希望这对一些人有帮助:D