【问题标题】:How to stop a Xamarin.Forms behavior used to asynchronously translate an image?如何停止用于异步转换图像的 Xamarin.Forms 行为?
【发布时间】:2020-01-21 12:39:04
【问题描述】:

在 Xamarin.Forms 项目中,我尝试将图像从位置 A(x,y) 重复转换到位置 B(x,y) 并返回,从 B 到 A。为此,我阅读可以自定义行为。

我扩展了 Behavior 类,覆盖了 OnAttachedTo 和 OnDetachingFrom。在 OnAttachedTo 方法中,我启动了一个重复执行两个翻译的任务。

这是我的行为类:

public class MoveImageBehavior : Behavior<Image>
{
    private Image _Image = null;

    public static readonly BindableProperty AnimatedProperty = BindableProperty.Create("Animated", typeof(bool), typeof(ImageAnimatedBehavior), defaultValue: false);
    public bool Animated
    {
        get { return (bool)GetValue(AnimatedProperty); }
        set { SetValue(AnimatedProperty, value); }
    }

    protected override void OnAttachedTo(Image image)
    {
        base.OnAttachedTo(image);

        _Image = image;
        Animated = true;
        Task.Run(AnimateImage);
    }

    protected override void OnDetachingFrom(Image image)
    {
        base.OnDetachingFrom(image);
        _Image = null;
    }

    private async void AnimateImage()
    {
        while (_Image != null && Animated)
        {
            await _Image.TranslateTo(100, 100, 1000);
            await _Image.TranslateTo(0, 0, 1000);
        }
    }
}

xaml 文件中的图片:

<ContentView>
    <Grid>
        <Image x:Name="image_translating" Source="my_icon" Aspect="AspectFit">
            <Image.Behaviors>
                <behaviors:MoveImageBehavior Animated="{Binding ImageTranslating}" BindingContext="{Binding BindingContext, Source={x:Reference image_translating}}"/>
            </Image.Behaviors>
        </Image>
    </Grid>
</ContentView>

图像按照我的意愿反复正确翻译,但我无法停止 while 例程。当 ViewModel 中的 Animated 设置为 false 并且永远不会调用 OnDetachingFrom 时,属性绑定不起作用。 我究竟做错了什么?有什么建议吗?

【问题讨论】:

    标签: xamarin.forms mvvmcross behavior


    【解决方案1】:

    通过文档,我们可以看到:

    当行为被移除时,OnDetachingFrom 方法被触发 控制。此方法接收对要访问的控件的引用 它是附加的,用于执行任何所需的清理。为了 例如,您可以取消订阅控件上的事件以防止 内存泄漏。

    仅当您从图像中删除行为时才会触发。我会给你一个关于如何停止动画的例子:

    我在后面的代码中定义了一个bool属性来控制是否停止:

      public bool showA  = true;
    

    我添加一个按钮作为停止动画的例子:

    private void Button_Clicked(object sender, EventArgs e)
    {
        showA = !showA;
    
        if (showA)
        {
            image_translating.Behaviors.Add(new MoveImageBehavior());
    
        }
        else
        {
            var toRemove = image_translating.Behaviors.FirstOrDefault(b => b is MoveImageBehavior);
            if (toRemove != null)
            {
                image_translating.Behaviors.Remove(toRemove);
            }
        }
    }
    

    同样在您的OnDetachingFrom 方法中,不要将图像设置为null,它会导致预期为空,只需将Animated 设置为false:

    protected override void OnDetachingFrom(Image image)
    {
        base.OnDetachingFrom(image);
        Animated = false;
    }
    

    您可以将我的点击事件转换为您项目中的某个绑定并使其工作。

    参考:creating-a-xamarinforms-behaviorer

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 2016-08-10
      • 2019-12-07
      • 1970-01-01
      • 2021-12-23
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多