.Net Maui页面,其中包含CarouselView
和通过将数据绑定到ViewModel中的项集合而创建的卡片列表(VM)。我正在寻找方法来动画控制内CarouselView
的一些属性在VM设置为一个特定的值。动画应该在c#代码中完成(代码隐藏、触发操作、行为等),而不是通过xaml。不确定如何正确实现。这是我认为可能的解决方案:
- 在VM中声明事件并在代码隐藏中订阅它。对于非模板控件非常有效,但对于
CarouselView
,它由DataTemplate
中描述的Card控件集合组成,我只需要找到特定的活动控件,比如说我想动画化的Label
。不知道如何找到它,VM集合中的每个项都有它的一个示例,但即使我这样做,它看起来也不是一个很好的面向MVVM的设计。 - 我最大的希望是
TriggerAction<Label>
(假设我想制作Label
动画),但问题是TriggerAction似乎只能在EventTrigger
中工作,它只捕获xaml控件事件,而不是VM事件。但另一方面,它不允许在内部声明TriggerAction<T>
。不知道为什么在.Net毛伊岛有这样的限制,我希望我有两者的一些混合。 - 行为,-与触发器一样,不确定如何通过VM中声明任何属性更改或事件来运行它们
第一个
3条答案
按热度按时间cqoc49vn1#
正如您所说,datatemplate中的控件很难访问,所以我做了一个示例来测试Label的
TranslateX
属性,发现label.TranslateTo(60, 0, 100);
和label.TranslateX = 60
的效果是一样的。据此,可以在Item中创建一个变量,绑定到DataTemplate中的label,在page.cs中修改item的值,也可以使用
DataTrigger
设置label.TranslateX的值。k0pti3hp2#
好的,我已经找到了一种方法,通过行为中的可绑定属性来实现它。虽然比我预期的要复杂一些,但它确实有效。不幸的是,. NET Maui没有提供更好更直观的方法来实现它,我想这是需要改进的地方。
代码如下:
然后,您可以将动画绑定到任何可视元素,如
Frame
:6ioyuze23#
请注意,
TranslateTo
是可等待的,并且可能需要async
/await
模式来使元素具有动画效果,尤其是在调用了多个TranslateTo
时。添加了
async
/await
的TriggerAction
:由于某种原因,仅使用一个
TranslateTo
时不需要async
/await
,这将设置以下动画:XAML文件: