我有一个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
按需重画(或此后不久)?
答案 0 :(得分:0)
这是Android开发人员不时遇到的一个常见问题(我猜是一个小问题,而更多是基于事件的Android系统的挂断)。我在使用Xamarin.Android本机解决方案时亲自看到了它。有一篇有趣的文章here,其中详细讨论了潜在问题。诚然,它讨论了其他控件,例如文本框和按钮,但是原理基本相同。
Android不会重新绘制 滑块,直到用户下次与之交互为止。
本文对此进行了很好的解释。查看UISlider的本机Java建议,您可以尝试设置最大值,然后直接将现有的UISlider值设置为已经存在的值,这将强制重绘。这不是很理想,但暂时应该是一种快速的解决方法。
触发的值更改事件应强制android处理待处理的UI事件。