Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin-如何使用MessagingCenter触发动画_C#_Xamarin_Animation_Xamarin.forms_Messagingcenter - Fatal编程技术网

C# Xamarin-如何使用MessagingCenter触发动画

C# Xamarin-如何使用MessagingCenter触发动画,c#,xamarin,animation,xamarin.forms,messagingcenter,C#,Xamarin,Animation,Xamarin.forms,Messagingcenter,我有一个ContentView,它订阅了来自ViewModel的MessagingCenter消息(以便通过不将视图耦合到ViewModel来维护mvvm模式)。 当ContentView收到消息时,我希望它执行一个动画,使滑动视图可见,如下所示: MessagingCenter.Subscribe<SideMenuViewModel>(this, "IsMenuOpen", async (sender) => { if (sender.IsMenu

我有一个
ContentView
,它订阅了来自ViewModel的
MessagingCenter
消息(以便通过不将视图耦合到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.Subscribe(此“IsMenuOpen”,异步(发送方)=>
{
如果(发送方打开)
{
MainSwipeView.Open(OpenSwipeItem.RightItems);
等待swipcontent.ScaleYTo(1300,Easing.SinOut);
}
其他的
{
MainSwipeView.Close();
等待swipcontent.ScaleYTo(1300,Easing.SinOut);
}
});
此动画与我在同一文件上的其他事件侦听器中的动画相同,工作正常。但是,在
MessagingCenter
中,执行链工作正常,它调用动画方法,但没有动画发生


这可能是线程问题吗?我尝试了
wait
beginInvokeMainThread
,但都没有成功。

尝试做一些这样的事情,希望能有所帮助

发送信息中心

订阅信息中心

MessagingCenter.Subscribe(此“SideMenuViewModel:IsMenuOpen”,(发件人,IsMenuOpen)=>
{
如果(打开)
{
MainSwipeView.Open(OpenSwipeItem.RightItems);
等待swipcontent.ScaleYTo(1300,Easing.SinOut);
}
其他的
{
MainSwipeView.Close();
等待swipcontent.ScaleYTo(1300,Easing.SinOut);
}
});
您的bool值将在subscribe的
IsMenuOpen
参数中获取。仅在MessagingCenter中具有本地范围


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

等待swipcontent.ScaleYTo(1300,Easing.SinOut)

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

比如:


如何从消息中心实际发送数据,请添加以下内容:well@Blu这并不重要,因为订阅者在获取消息时工作得非常好,但只是动画方法在被调用时不起作用。现在可以工作了吗?这些是MessagingCenter的有用提示,但是他们实际上并没有帮助解决这个问题。。。我的问题是MessagingCenter按预期工作,并调用了动画方法,但即使调用了ScaleToY方法,也不会发生动画。我刚才看到,在您的
if-else
中,两者都有相同的操作
wipeContent.scaleTo(1300,Easing.SinOut)是的,它们是相同的操作,但这不是问题所在,问题是无论
的哪个部分发生,如果发生其他情况,根本不会发生动画
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);
        }
});
await SwipeContent.ScaleYTo(1.5, 300, Easing.SinOut);