在 Xamarin.Forms 中更改 ScrollBar 的颜色

Posted

技术标签:

【中文标题】在 Xamarin.Forms 中更改 ScrollBar 的颜色【英文标题】:Change the color of the ScrollBar in Xamarin.Forms 【发布时间】:2022-01-05 18:07:30 【问题描述】:

我需要建议。我正在尝试更改 Xamarin Forms 中 ScrollBar 的颜色。 我创建了 ScrollBarColorEffect 但不幸的是它不起作用它会报告此错误。

有人会知道错误在哪里。

XF ScrollBarColorEffect.cs

public class ScrollBarColorEffect : RoutingEffect

    public ScrollBarColorEffect() : base($"MPlay.nameof(ScrollBarColorEffect)")
    
    public Color ScrollBarColor  get; set; 

Xamarin android ScrollBarColorEffect.cs

[assembly: ResolutionGroupName("MPlay")]
[assembly: ExportEffect(typeof(MPlay.Droid.ScrollBarColorEffect), 
nameof(MPlay.Droid.ScrollBarColorEffect))]
namespace MPlay.Droid


public class ScrollBarColorEffect : PlatformEffect

    protected override void OnAttached()
    
        UpdateUI();
    

    protected override void OnDetached()
    
    
  
    void UpdateUI()
    
        Xamarin.Forms.ScrollView _scrollView = Element as Xamarin.Forms.ScrollView;
        if (Element != null && Control is AndroidX.Core.Widget.NestedScrollView scrollView)
        
            Java.Lang.Reflect.Field mScrollCacheField = Class.FromType(typeof(Android.Views.View)).GetDeclaredField("mScrollCache");
            mScrollCacheField.Accessible = true;

            var mScrollCache = mScrollCacheField.Get(scrollView);
            var scrollBarField = mScrollCache.Class.GetDeclaredField("scrollBar");
            scrollBarField.Accessible = true;
            var scrollBar = scrollBarField.Get(mScrollCache);
            if (scrollBar != null)
            
                var method = scrollBar.Class.GetDeclaredMethod("setVerticalThumbDrawable", Class.FromType(typeof(Drawable)));
                method.Accessible = true;

                var layers = new Drawable[1];
                var shapeDrawable = new ShapeDrawable(new RectShape());
                var scrollBarColor = Color.Default;

                var effect = _scrollView.Effects.FirstOrDefault(e => e is Core.Effects.ScrollBarColorEffect) as Core.Effects.ScrollBarColorEffect;
                //var effect = (Core.Effects.ScrollBarColorEffect)Element.Effects.FirstOrDefault(e => e is Core.Effects.ScrollBarColorEffect);
                if (effect != null)
                
                    scrollBarColor = effect.ScrollBarColor;
                

                shapeDrawable.Paint.Color = scrollBarColor.ToAndroid();
                shapeDrawable.SetIntrinsicWidth(5);

                layers[0] = shapeDrawable;
                method.Invoke(scrollBar, layers);
            
        
    

XAML XF

 <ScrollView>
        <ScrollView.Effects>
            <helpers:ScrollBarColorEffect ScrollBarColor="Red"/>
        </ScrollView.Effects>
 </ScrollView>

我尝试创建自己的渲染,请参见此处:https://***.com/a/65127686/6473719

不幸的是,我得到了同样的错误

【问题讨论】:

【参考方案1】:

您使用的代码应该在 API 29 之前工作。在 Android 10(API 29)上,存在非 SDK 接口限制。

您使用的方法 setVerticalThumbDrawable 在 Android 10 中现已被阻止的非 SDK 接口中。

现在在 Android 10 中被阻止的非 SDK 接口:https://developer.android.google.cn/about/versions/10/non-sdk-q#q-list-changes

在 Android 开发者中,建议改用setVerticalScrollbarThumbDrawable。 https://developer.android.google.cn/reference/android/view/View?hl=zh-cn#setVerticalScrollbarThumbDrawable(android.graphics.drawable.Drawable)

【讨论】:

我正在测试另一种方式,并会尽快反馈。 非常感谢您的提醒。不幸的是,即使更改为 setVerticalScrollbarThumbDrawable,同样的错误仍然出现i.imgur.com/zxPGsbo.png。我的项目 Xamarin.Android 面向 Android 11 (API 30)。您有一个可执行的项目或示例。非常感谢您的努力。

以上是关于在 Xamarin.Forms 中更改 ScrollBar 的颜色的主要内容,如果未能解决你的问题,请参考以下文章

更改 DatePicker [Xamarin.Forms] 的颜色

Xamarin.Forms - 更改状态栏颜色

Xamarin.Forms 仅在一个平台 (iOS) 上更改条目的占位符颜色和文本颜色

更改 Xamarin Forms Picker 按钮样式 [重复]

如何在单击 xamarin.forms.maps iOS c# 时更改 pin 图标

如何使用 Xamarin Forms 更改键盘的习惯用法