首页 > 解决方案 > 更新最小值/最大值时重绘 Xamarin (Android) 滑块

问题描述

我有一个 Xamarin 滑块,其Maximum值正在动态更改,我希望它在更新后在屏幕上重绘。

在 iOS 上一切正常,但 Android 直到用户下一次与之交互时才会重绘滑块。

我希望这种依赖于平台的行为需要自定义渲染器。我可以捕获我想要触发重绘的 PropertyChangedEvent,但我无法真正重绘滑块。

这是我到目前为止在渲染器上的内容。我已经尝试了注释掉的代码的不同组合,但我没有真正触发重绘。(调试显示正在到达代码,只是没有重绘屏幕。)

[assembly: ExportRenderer(typeof(Slider), typeof(MySliderRenderer))]

namespace MyProject.Droid.Renderers
{
    public class MySliderRenderer : SliderRenderer
    {
        public MySliderRenderer(Context context) : base(context)
        {
            // this.SetWillNotDraw(false);
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            if (e.PropertyName == nameof(Slider.Maximum) || e.PropertyName == nameof(Slider.Minimum))
            {

                // Control.PostInvalidate();
                // Control.Invalidate();
                // Control.ForceLayout();
                // Control.PerformClick();
                // Control.RefreshDrawableState();

                // PostInvalidate();
                // Invalidate();
                // ForceLayout();
                // PerformClick();
                // RefreshDrawableState();
            }
        }
    }
}

当内置数据绑定未能按我期望的方式触发更新时,如何强制View按需(或此后不久)重绘?

标签: androidxamarinxamarin.android

解决方案


这是 Android 开发人员不时遇到的一个常见问题(我猜这不是一个问题,而更像是基于 Android 事件的系统的挂起)。我在使用 Xamarin.Android 本机解决方案时亲眼目睹了这一点。这里有一篇有趣的文章,详细讨论了潜在问题。诚然,它谈到了其他控件,如文本框和按钮,但原理基本相同。

直到用户下次与之交互时,Android 才会重新绘制滑块。

这篇文章很好地解释了这一点。查看 UISlider 的本机 Java 建议您可以尝试设置最大值,然后直接将现有的 UISlider 值设置为已经存在的值,这应该会强制重绘。这并不理想,但暂时应该是一个快速的解决方法。

触发的值更改事件应强制 android 处理应用程序挂起的 UI 事件。


推荐阅读