我们可以在ScrollView Xamarin.Forms中隐藏滚动条吗

本文关键字:隐藏 滚动条 Forms Xamarin ScrollView 我们 | 更新日期: 2023-09-27 18:27:19

如标题所述

是否可以在ScrollView Xamarin.Forms中隐藏滚动条,而不必为每个平台创建自定义渲染器?

我似乎找不到任何不使用自定义渲染器的答案、建议或示例。

我们可以在ScrollView Xamarin.Forms中隐藏滚动条吗

编辑2018年3月7日:对于Googleability:合并了一个PR,将此功能添加到默认的Xamarin.Forms工具包中。它应该很快在NuGets中发布。

原始答案:

正如评论中所述,如果不使用CustomRenderer,您将无法实现这一点。

在你的iOS和Droid项目中创建一个类ScrollViewExRenderer,并将其放入其中,代码也取自评论中的链接;

public class ScrollViewExRenderer : ScrollViewRenderer
{
    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);
        if (e.OldElement == null || this.Element == null)
            return;
        if (e.OldElement != null)
            e.OldElement.PropertyChanged -= OnElementPropertyChanged;
        e.NewElement.PropertyChanged += OnElementPropertyChanged;
    }
    protected void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (ChildCount > 0)
        {
            GetChildAt(0).HorizontalScrollBarEnabled = false;
            GetChildAt(0).VerticalScrollBarEnabled = false;
        }
    }
} 

在名称空间声明的上方放置此行;

[assembly: ExportRenderer(typeof(ScrollView), typeof(ScrollViewExRenderer))]

现在您的ScrollView不应该显示任何滚动条

嘿,发布答案似乎有点晚了,但由于你还没有选择答案,我将发布android和windows项目的过程。杰拉德给出的答案可能在某个时候是正确的,但我没能让它发挥作用,也许是因为xamarin已经改变了很多。

在.DROID和UWP项目中创建一个新类,并添加以下代码

对于UWP

using Windows.UI.Xaml.Controls;
using System.ComponentModel;
using Xamarin.Forms;
using Xamarin.Forms.Platform.UWP;
[assembly: ExportRenderer(typeof(ScrollView), typeof(App3.UWP.Scrollbardisabledrenderer))]
namespace App3.UWP
{
    public class Scrollbardisabledrenderer : ScrollViewRenderer
    {
        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {

            Control.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden;
            Control.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;
        }

    }
}

对于.DROID

using System.ComponentModel;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(ScrollView), typeof(App3.Droid.Scrollbardisabledrenderer))]
namespace App3.Droid
{
    public class Scrollbardisabledrenderer : ScrollViewRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
            if (e.OldElement != null || this.Element == null)
                return;
            if (e.OldElement != null)
                e.OldElement.PropertyChanged -= OnElementPropertyChanged;
            e.NewElement.PropertyChanged += OnElementPropertyChanged;

        }
        protected void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {

                this.HorizontalScrollBarEnabled = false;
                this.VerticalScrollBarEnabled = false;

        }
    }
}

我很抱歉。IOS我不能确认我的代码是否工作,因为我没有mac。

@Akaya93@Zany您可以使用下一个代码隐藏iOS的滚动条:

this.ShowsHorizontalScrollIndicator = false;
this.ShowsVerticalScrollIndicator = false;

如果你有垂直滚动视图,你可以把VerticalScrollBarVisibility="Never"放在你的xaml:中

<ScrollView Orientation="Vertical" VerticalScrollBarVisibility="Never">

如果你有水平滚动视图,你可以把HorizontalScrollBarVisibility ="Never"放在你的xaml:中

<ScrollView Orientation="Horizontal" HorizontalScrollBarVisibility ="Never">

为了在我的Android解决方案上的XamarinForms中隐藏ScrollBar,我使用了这个:

https://forums.xamarin.com/discussion/73353/how-to-hide-scroll-bar-in-scrollview

但对于IOS,你必须稍微更改一个代码:

public class ScrollBarDisabledRenderer : ScrollViewRenderer    
{   
     protected override void OnElementChanged(VisualElementChangedEventArgs e)
     {
        base.OnElementChanged(e);
        if (e.OldElement != null || Element == null)
            return;
        if (e.OldElement != null)
            e.OldElement.PropertyChanged -= OnElementPropertyChanged;
        e.NewElement.PropertyChanged += OnElementPropertyChanged;
      }
    private void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        ShowsHorizontalScrollIndicator = false;
        ShowsVerticalScrollIndicator = false;
    }
}

命名空间声明上方:

[assembly: ExportRenderer(typeof(MyScrollView), typeof(ScrollBarDisabledRenderer))]

因此,IOS:的属性名称不同

ShowsHorizontalScrollIndicator = false; ShowsVerticalScrollIndicator = false;

此代码适用于Android和IOS替换:

this.HorizontalScrollBarEnabled = false;
this.VerticalScrollBarEnabled = false;

通过

ShowsHorizontalScrollIndicator = false;
ShowsVerticalScrollIndicator = false;