android - 更新最小值/最大值时重绘 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
按需(或此后不久)重绘?
解决方案
这是 Android 开发人员不时遇到的一个常见问题(我猜这不是一个问题,而更像是基于 Android 事件的系统的挂起)。我在使用 Xamarin.Android 本机解决方案时亲眼目睹了这一点。这里有一篇有趣的文章,详细讨论了潜在问题。诚然,它谈到了其他控件,如文本框和按钮,但原理基本相同。
直到用户下次与之交互时,Android 才会重新绘制滑块。
这篇文章很好地解释了这一点。查看 UISlider 的本机 Java 建议您可以尝试设置最大值,然后直接将现有的 UISlider 值设置为已经存在的值,这应该会强制重绘。这并不理想,但暂时应该是一个快速的解决方法。
触发的值更改事件应强制 android 处理应用程序挂起的 UI 事件。
推荐阅读
- javascript - 执行鼠标“onwheel 事件”时检测目标父元素
- flutter - 如果 Dart 中的 else 块在分号上给出错误
- jestjs - 如何检查函数是否为模拟函数?
- c# - C# 深拷贝列表
- python - 如何在matplotlib的x轴上正确绘制回归输出与正确的日期时间索引?
- c - 为什么c中的分段错误以及如何使其工作?
- postgresql - Doobie 中的 Postgresql 数组编码 – text[] 与 varying[]
- html - span 标签的 CSS 选择器部分文本
- algorithm - 用数学形式替换连续数字
- vb.net - 将 Mdi Parent 作为对象打开不会让在 VB.Net 中从另一个 Mdi 子窗体打开 Mdi 子窗体