Xamarin — Как запустить анимацию с помощью MessagingCenter

#c# #xamarin #animation #xamarin.forms #messagingcenter

#c# #xamarin #Анимация #xamarin.forms #messagingcenter

Вопрос:

У меня есть, ContentView который подписан на MessagingCenter сообщение из ViewModel (для того, чтобы поддерживать шаблон mvvm, не связывая представление с ViewModel). Когда сообщение получено ContentView , я хотел, чтобы оно выполняло анимацию, чтобы сделать видимым вид салфетки следующим образом:

 MessagingCenter.Subscribe<SideMenuViewModel>(this, "IsMenuOpen", async (sender) =>
{
    if (sender.IsMenuOpen)
    {
        MainSwipeView.Open(OpenSwipeItem.RightItems);
        await SwipeContent.ScaleYTo(1, 300, Easing.SinOut);
    }
    else
    {
        MainSwipeView.Close();
        await SwipeContent.ScaleYTo(1, 300, Easing.SinOut);
    }
});
  

Эта анимация такая же, как у меня в других прослушивателях событий в том же файле, и она отлично работает. Однако в MessagingCenter цепочка выполнения работает нормально, и она вызывает метод анимации, но анимации не происходит.

Может ли это потенциально быть проблемой с потоками? Я пробовал оба await и BeginInvokeOnMainThread , но ни то, ни другое не сработало.

Комментарии:

1. Как вы на самом деле отправляете данные из центра обмена сообщениями, добавьте это также

2. @Blu На самом деле это не имеет значения, поскольку Подписчик отлично справляется с получением сообщения, но просто методы анимации не работают, когда они вызываются.

3. Может ли это работать сейчас?

Ответ №1:

Попробуйте сделать что-нибудь подобное, надеюсь, это может быть полезно.

MessagingCenter для ОТПРАВКИ

 MessagingCenter.Send(this, "SideMenuViewModel:IsMenuOpen", IsMenuOpen);  //IsMenuOpen - is the bool value for your situation
  

MessagingCenter для ПОДПИСКИ

 MessagingCenter.Subscribe<SideMenuViewModel, bool>(this, "SideMenuViewModel:IsMenuOpen", (sender, IsMenuOpen) =>
     {
        if (IsMenuOpen)
        {
            MainSwipeView.Open(OpenSwipeItem.RightItems);
            await SwipeContent.ScaleYTo(1, 300, Easing.SinOut);
        }
        else
        {
            MainSwipeView.Close();
            await SwipeContent.ScaleYTo(1, 300, Easing.SinOut);
        }
});
  

Ваше значение bool будет выбрано в IsMenuOpen параметре subscribe. Которая будет иметь область действия локально только в MessagingCenter.

Дайте мне знать, нормально ли это работает или нет…

Комментарии:

1. Это полезные советы для MessagingCenter, но на самом деле они не помогают решить проблему… Моя проблема заключалась в том, что MessagingCenter работает должным образом, и вызываются методы анимации, но анимация не происходит, даже если вызывается метод ScaleToY.

2. я только что видел это, в вашем if else оба имеют одинаковые операции wipeContent.ScaleYTo(1, 300, Easing.SinOut);

3. Да, это одна и та же операция, но проблема не в этом, проблема в том, что независимо от того, какая часть if else происходит, анимация вообще не происходит

Ответ №2:

await SwipeContent.ScaleYTo(1, 300, Easing.SinOut);

ScaleTo Метод получает текущее Scale значение свойства (значение по умолчанию 1) для начала анимации, а затем масштабируется от этого значения до своего первого аргумента, 1 кажется, означает отсутствие изменений, и вы пытаетесь изменить его на значение, которое не является 1 .

Нравится:

 await SwipeContent.ScaleYTo(1.5, 300, Easing.SinOut);