Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新最小/最大值时重新绘制Xamarin(Android)滑块_Android_Xamarin_Xamarin.android - Fatal编程技术网

更新最小/最大值时重新绘制Xamarin(Android)滑块

更新最小/最大值时重新绘制Xamarin(Android)滑块,android,xamarin,xamarin.android,Android,Xamarin,Xamarin.android,我有一个Xamarin滑块,其最大值正在动态更改,我希望它在更新后在屏幕上重新绘制 在iOS上,一切都按预期运行,但Android直到用户下次与滑块交互时才重新绘制滑块 我希望这种依赖于平台的行为是对自定义渲染器的调用。我可以捕获我想要触发重画的PropertyChangedEvent,但是我还不能真正重画滑块 以下是我到目前为止对渲染器的了解。我尝试了注释掉的代码的不同组合,但实际上并没有触发重画。(调试显示代码正在访问,只是没有重新绘制屏幕。) 当内置数据绑定无法按我预期的方式触发更新时,我

我有一个Xamarin滑块,其
最大值正在动态更改,我希望它在更新后在屏幕上重新绘制

在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();
            }
        }
    }
}