Как остановить поведение Xamarin.Forms, используемое для асинхронного перевода изображения? - PullRequest
0 голосов
/ 20 сентября 2019

В проекте 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>

Изображение неоднократно корректно транслируется, как я хочу, но я не могу остановить рутину.Привязка свойства не работает, когда для Animated установлено значение false во ViewModel и OnDetachingFrom никогда не вызывается.Что я делаю неправильно?Есть предложения?

1 Ответ

1 голос
/ 23 сентября 2019

Из документа видно, что:

Метод 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;
}

Вы можете преобразовать мое событие click в какое-нибудь связывание в вашем проекте и заставить его работать.

См. creation-a-xamarinforms-поведениеiorer

...