DLToolkit.Forms.Controls icon indicating copy to clipboard operation
DLToolkit.Forms.Controls copied to clipboard

Ability to change scrollbar color

Open LeoJHarris opened this issue 5 years ago • 1 comments

Hi there, would love to see the ability to change the horizontal scrollbar color, this is just a feature request. Thanks

LeoJHarris avatar Apr 05 '19 01:04 LeoJHarris

I got the scrollbar color changed on android

in .net standard project


public static readonly BindableProperty ScrollBarColorBindableProperty =
            BindableProperty.Create(nameof(ScrollBarColor), typeof(Color), typeof(EnhancedListView), Color.Gray);

public Color ScrollBarColor
        {
            get
            {
                return (Color)GetValue(ScrollBarColorBindableProperty);
            }
            set
            {
                SetValue(ScrollBarColorBindableProperty, value);
            }
        }

Using this in the native android project with a renderer that simply extends ListViewRenderer

protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ListView> e)
        {
            base.OnElementChanged(e);
            if (e.NewElement != null && e.NewElement is EnhancedFlowListView enhancedFlowListView)
            {
                Java.Lang.Reflect.Field mScrollCacheField = Java.Lang.Class.FromType(typeof(Android.Views.View)).GetDeclaredField("mScrollCache");
                mScrollCacheField.Accessible = true;
                Java.Lang.Object mScrollCache = mScrollCacheField.Get(Control);
                Java.Lang.Reflect.Field scrollBarField = mScrollCache.Class.GetDeclaredField("scrollBar");
                scrollBarField.Accessible = true;
                Java.Lang.Object scrollBar = scrollBarField.Get(mScrollCache);
                Java.Lang.Reflect.Method method = scrollBar.Class.GetDeclaredMethod("setVerticalThumbDrawable", Java.Lang.Class.FromType(typeof(Drawable)));
                method.Accessible = true;
                Drawable[] layers = new Drawable[1];
                ShapeDrawable sd1 = new ShapeDrawable(new RectShape());
                sd1.Paint.Color = enhancedFlowListView.ScrollBarColor.ToAndroid();
                sd1.SetIntrinsicWidth(6);
                layers[0] = sd1;
                method.Invoke(scrollBar, layers);
            }
        }

LeoJHarris avatar Apr 05 '19 01:04 LeoJHarris