0

我有一个ContentView订阅MessagingCenter来自 ViewModel 的消息(为了通过不将视图耦合到 viewModel 来维护 mvvm 模式)。当收到消息时,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执行链中工作正常,它调用动画方法但没有动画发生。

这可能是线程问题吗?我都试过了awaitBeginInvokeOnMainThread但都没有奏效。

4

2 回答 2

0

尝试这样做,希望它可能会有所帮助。

发送消息中心

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

订阅消息中心

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

您的布尔值将在IsMenuOpensubscribe 的参数中获取。这将仅在 MessagingCenter 内具有本地范围。

让我知道它是否工作正常......

于 2020-09-15T11:06:35.130 回答
0

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

ScaleTo方法获取动画开始时的当前Scale属性值(默认值为 1),然后从该值缩放到其第一个参数,1似乎意味着没有变化,而您尝试将其更改为 not 的值1

喜欢:

await SwipeContent.ScaleYTo(1.5, 300, Easing.SinOut);
于 2020-09-16T07:13:18.487 回答