Quería agregar un indicador de desplazamiento hacia abajo a ScrollView en mi aplicación Xamarin , para lo cual seguí este artículo .
Lo que en realidad hace es que agrega un indicador de desplazamiento hacia abajo ( Label ) fuera de Scrollview , por lo que si el texto es más grande que el tamaño de la página muestra esta indicación, escrita "¡ Desplácese hacia abajo para obtener más! ", y al desplazarse completamente hacia el fin, oculta este indicador.
Esta parte está funcionando, pero si el texto es menor que la página, todavía muestra este indicador de desplazamiento hacia abajo.
Quiero que si el texto es menor que la página, la visibilidad del indicador de desplazamiento hacia abajo debería ser falsa.
.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; }Haciendo malabarismos con su código, llegué a una solución que podría llevarlo a donde desea.
¿Solo buscas la solución? vaya y lea la sección Solución . Si quieres saber el por qué , sigue adelante y lee la sección Explicación .
En primer lugar, me di cuenta de que en el código que publicó, la Label en el archivo Xaml se llama ScrollDownIndicator , pero en el controlador de eventos está cambiando una variable llamada ScrollDownPrompt . En mis pruebas seguí adelante para igualar ambos nombres...
En su archivo .xaml.cs , agregue las siguientes líneas al constructor de su página:
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; } En su código, solo cambia la visibilidad del Indicador del controlador de eventos: MyScrollView_Scrolled . Si no se realiza desplazamiento, no se llama al controlador de eventos y no se verifica la visibilidad del indicador: simplemente siempre está visible.
Para corregir este comportamiento, debe verificar la visibilidad cuando cambia la propiedad ContentSize de ScrollView.
Espero que esto ayude a algunas personas: D