更新最小/最大值时重新绘制Xamarin(Android)滑块
我有一个Xamarin滑块,其更新最小/最大值时重新绘制Xamarin(Android)滑块,android,xamarin,xamarin.android,Android,Xamarin,Xamarin.android,我有一个Xamarin滑块,其最大值正在动态更改,我希望它在更新后在屏幕上重新绘制 在iOS上,一切都按预期运行,但Android直到用户下次与滑块交互时才重新绘制滑块 我希望这种依赖于平台的行为是对自定义渲染器的调用。我可以捕获我想要触发重画的PropertyChangedEvent,但是我还不能真正重画滑块 以下是我到目前为止对渲染器的了解。我尝试了注释掉的代码的不同组合,但实际上并没有触发重画。(调试显示代码正在访问,只是没有重新绘制屏幕。) 当内置数据绑定无法按我预期的方式触发更新时,我
最大值正在动态更改,我希望它在更新后在屏幕上重新绘制
在iOS上,一切都按预期运行,但Android直到用户下次与滑块交互时才重新绘制滑块
我希望这种依赖于平台的行为是对自定义渲染器的调用。我可以捕获我想要触发重画的PropertyChangedEvent,但是我还不能真正重画滑块
以下是我到目前为止对渲染器的了解。我尝试了注释掉的代码的不同组合,但实际上并没有触发重画。(调试显示代码正在访问,只是没有重新绘制屏幕。)
当内置数据绑定无法按我预期的方式触发更新时,我如何强制视图
按需(或此后不久)重新绘制?这是android开发人员经常遇到的一个问题(我想这不是一个问题,更多的是基于Androids事件系统的挂起问题)。我在使用Xamarin.Android原生解决方案时亲眼目睹了这一点。有一篇有趣的文章详细地讨论了潜在的问题。诚然,它谈到了其他控件,如文本框和按钮,但其原理基本相同
Android不会重新绘制
滑块,直到用户下次与它交互
这篇文章对此做了很好的解释。查看一下UISlider的本机Java,建议您可以尝试设置max值,然后直接将现有的UISlider值设置为现有值,这将强制重新绘制。这并不理想,但目前应该是一个快速的解决办法
触发的值更改事件应强制android处理应用程序挂起的UI事件。您是否考虑过实现自定义属性更改事件模式,以便在最大值更改时强制重画,而不是使用控件公开的元素更改事件。事实上,没有类似valuechanged这样的事件吗?@Digitalsa1nt我不确定我是否理解。当我想强制重画的时候,我已经可以检测到,这是重画本身难以捉摸。实现自定义事件不会给我带来同样的问题吗?抱歉,我认为我不是很清楚,我已经发布了一个可能的解决方案的答案,我还没有机会测试它,但它在理论上应该可以工作。安卓似乎太聪明了一半。据我所知,它不会重新绘制滑块,除非其值已更改,因此Value=Value
没有任何效果。我遇到了一个黑客,我在值中添加了一小部分,然后触发相关的PropertyChangedEvent。这感觉像是一个被黑客攻击的解决方案,但它现在可以工作了。@b帕特森没有问题,这似乎是一个明智的做法。如果我有机会的话,我会看看是否能为你们想出一个更好的解决方案,并相应地修改我的答案。
[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();
}
}
}
}