我有一个 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
按需(或此后不久(重绘?
这是安卓开发人员不时遇到的一个常见问题(我猜不是问题,更多的是 Android 基于事件的系统的挂断(。我在开发Xamarin.Android本机解决方案时亲眼见过它。这里有一篇有趣的文章,详细讨论了潜在的问题。诚然,它谈论的是文本框和按钮等其他控件,但原理基本相同。
安卓不会重绘 滑块,直到用户下次与其交互。
这篇文章很好地解释了这一点。查看UISlider的本机Java建议您可以尝试设置最大值,然后直接将现有的UISlider值设置为已经存在的任何值,这应该强制重绘。这并不理想,但目前应该是一个快速的解决方法。
触发的值更改事件应强制 android 处理挂起的应用 UI 事件。