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

C# 我们可以在ScrollView Xamarin.Forms中隐藏滚动条吗,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,如标题所述 是否可以在ScrollViewXamarin.Forms中隐藏滚动条,而不必为每个平台创建自定义渲染器 我似乎找不到任何不使用自定义渲染器的答案、建议或示例。编辑2018年3月7日:适用于Googleability:a,它将此功能添加到默认的Xamarin.Forms工具包中。它应该很快在NuGets中发布 原始答案: 如评论中所述,如果不使用CustomRenderer,您将无法实现这一点 在iOS和Droid项目中创建一个类ScrollViewExRenderer,并将其放入其中

如标题所述

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

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

编辑2018年3月7日:适用于Googleability:a,它将此功能添加到默认的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))]

现在,您的
滚动视图
不应该显示任何滚动条

嘿,发布答案似乎有点晚,但由于您尚未选择答案,我将发布android和windows项目的过程。杰拉尔德给出的答案在某种程度上可能是正确的,但我无法让它发挥作用,可能是因为沙马林改变了很多

在.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;

        }


    }

}
机器人

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。

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

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


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

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

要在我的Android解决方案上隐藏XamarinForms中的滚动条,我使用以下方法:

但对于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的属性名称不同:

showshorizontalscrolindicator=false;

ShowsVerticalScrollIndicator=false

如果您有垂直滚动视图,您可以将
垂直滚动条visibility=“Never”
放在xaml中:

如果您有水平滚动视图,则可以将
horizontalcrollbarvisibility=“Never”
放在xaml中:


看这篇文章不,这离不开
自定义渲染器
@DoughnutZombie我已经读过那篇文章,它使用了
自定义渲染器
@GeraldVersluis,我明白了,你能给我一个指针让我理解如何使用
自定义渲染器
?当然没那么难。也许你可以先看看我的博客文章;我将创建一个anwser帖子,同时感谢Hanks man,很抱歉在一段时间后回复,但我可以问你如何隐藏Windows Phone的滚动条吗?@gerald versluis我知道这是一个旧问题/答案,但看起来
OnElementChanged
中有错误。该方法永远不会执行行
e.OldElement.PropertyChanged-=OnElementPropertyChanged因为它需要
e.OldElement!=null,但如果这是真的,则该方法将从其上方的
if
语句中退出。除非我错过了什么?嗨,戴夫!可能就是这样。我得检查一下。但我可以做得更好;我知道这将是Xamarin.Forms在不久的将来默认的一部分!我将再次通过这个答案,并根据需要进行更新。谢谢你让我知道@DaveWood更新了答案,同时引用了合并后的PR并修复了代码。谢谢你没有回答这个问题。OP特别要求通过一个代码集而不是每个平台两个不同的代码集来实现这一点。在OnElementPropertyChanged内部,正确的代码是:if(ChildCount>0){GetChildAt(0)。HorizontalScrollBarEnabled=false;GetChildAt(0)。VerticalScrollBarEnabled=false;}
[assembly: ExportRenderer(typeof(MyScrollView), typeof(ScrollBarDisabledRenderer))]