#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);