最小/最大更新时重画Xamarin(Android)滑块

时间:2018-06-20 13:53:22

标签: android xamarin 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按需重画(或此后不久)?

1 个答案:

答案 0 :(得分:0)

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

  

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

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

触发的值更改事件应强制android处理待处理的UI事件。