背景
我有一组想要在画布上绘制的对象。这些对象中的每一个都有一个DateTime属性,该属性确定该对象在画布上沿x轴的位置。每个对象还有一些其他属性,用于确定需要在画布上绘制的图像。我想要实现的最重要的功能是,随着时间的推移,第二个表示对象的这些图像将沿着x轴移动。换句话说,画布的右侧垂直边界将始终表示当前时间(例如DateTime.Now),并且集合中的对象需要更新它们相对于该边界在画布上的位置。我对Silverlight很新,因此我有很多问题,包括以下内容。另外,我还要求遵循MVVM框架。
问题
我应该在XAML中使用什么来实现上述目标?我想过使用带有Canvas的ItemsControl作为Panel,但我不知道该怎么做,甚至不知道它是否是最佳方式。任何实际的XAML代码都会很棒。
如何将对象集合绑定到画布?如果是这样,我如何随着时间的推移沿着x轴移动它们?也就是说,我希望画布随时更新:
很抱歉,如果我使用错误的条款,因为我还是Silverlight的新手。
感谢。
答案 0 :(得分:3)
我知道这个问题有点陈旧,但你可以使用渲染变换 - 我正在做类似的事情;
<ItemsControl ItemsSource="{Binding Notes}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Width="{Binding W}" Height="{Binding H}" BorderBrush="Navy" BorderThickness="5" CornerRadius="10">
<TextBlock Text="{Binding Text}"/>
<Border.RenderTransform>
<TransformGroup>
<... elided ...>
<TranslateTransform X="{Binding X}" Y="{Binding Y}"/>
</TransformGroup>
</Border.RenderTransform>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
答案 1 :(得分:2)
如果你真的想使用MVVM和数据绑定,那么将ItemsPanel定义为Canvas的ItemsControl可能正常工作。将ItemsControl.ItemsSource绑定到VM中的ObservableCollection。在ItemsControl的ItemTemplate中,将UI项目元素的Canvas.X和Canvas.Y绑定到您的数据项,使用中间的IValueConverter进行DateTime到X coord的映射等等。
这样的事情:
<ItemsControl ItemsSource="{Binding Path=MyItemsInVM, Mode=OneWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas></Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Width="50" Height="50" Canvas.Left="{Binding Path=MyDateTimeProperty, Converter={StaticResource DateTimeToLeftOffsetConverter}}" Canvas.Top="100" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
另一种方法是使用Model-View-Presenter模式。 MVVM不是镇上唯一的节目。当您需要进行大量UI操作或使用VSM时,Presenter可能更适合(尽管行为也可以发挥重要作用)。
您可以在演示者中设置以刷新间隔运行的计时器,并在Presenter中处理计时器事件以迭代集合并将对象映射到(X,Y)位置,直接更新UI元素。