我需要在不同的进程启动时显示某种动画。我最初的想法是简单地将一些<ContentControl>
标签添加到XAML并将它们绑定到View Model对象中的属性,然后简单地将此属性分配给ProgressBar
,一些繁忙的微调器或其他任何东西。
这有效,但我不喜欢它。我不喜欢它的主要原因是因为视图模型不应该涉及演示问题,这种模式明显打破了这种范式。
这几乎就是我(丑陋)的代码看起来像atm:
XAML:
<ContentControl Content="{Binding ProcessAAnimation}" />
在View Model类中:
public object ProcessAAnimation
{
get { return _processAAnimation; }
private set
{
_processAAnimation = value;
OnPropertyChanged("ProcessAAnimation");
}
}
public object IsProcessARunning
{
get { return _processARunning; }
private set
{
if (value == _processARunning)
return;
_processRunnings = value;
if (value)
ProcessAAnimation = SomeNiftyAnimationControl();
else
{
if (ProcessAAnimation is IDisposable)
((IDisposable)ProcessAAnimation).Dispose();
ProcessAAnimation = null;
}
}
}
// (clipped: More properties for "Process B", "Process C" and so on)
那么,有没有更好的模式来实现这一目标。最好是一个模式,我可以单独使用XAML动态创建动画控件吗?
请注意,我已经测试了一个解决方案,其中我声明了三个不同的动画控件,然后将它们的Visibility
属性绑定到View Model状态。然而,这在我的书中低于标准,因为我不想只是隐藏控件,我希望它们不会被删除。此外,这也使得无法根据需要动态使用不同类型的动画。
任何?
答案 0 :(得分:2)
您的ViewModel知道操作和进度本身。其余的可以通过触发器完成。至少就是我们这样做的方式。所以你的ViewModel有一个属性“IsLoadingImage”,例如,当你的viewmodel启动一个BackgroundWorker加载一个大图像时设置它,它还返回BackgroundWorker“ImageLoadingProgress”报告的进度,现在这两个属性足以传递给你的View 。您的视图由进度条或特殊动画的自定义控件组成。您现在可以在触发器中绑定“IsLoadingImage”以切换ProgressBar / Animation控件可见性,并将这些值绑定到“ImageLoadingProgress”。
就像我说的那样,这就是我们如何处理它,而我们的应用程序大量使用MVVM。
编辑回复评论:如何更改触发器中的模板
<ControlTemplate x:Name="ActiveTemplate" TargetType="{x:Type MyType}">
<!-- Template when active -->
</ControlTemplate>
<ControlTemplate x:Name="DeactivatedTemplate" TargetType="{x:Type MyType}">
<!-- Template when deactivated -->
</ControlTemplate>
<Style TargetType="{x:Type MyType}">
<Setter Property="Template" Value="{StaticResource DeactivatedTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsActive}" Value="True">
<Setter Property="Template" Value="{StaticResource ActiveTemplate}"/>
</DataTrigger>
</Style.Triggers>
</Style>
这假设MyType
是一个可以有ControlTemplate
的控件,并且DataContext
有一个属性IsActive
可以切换模板。