2

使用 MVVM 模式,我想将线条和文本写入画布,就像矢量 CAD 应用程序一样。在研究这一点时,我得出的结论是,我需要使用 ItemsControl 和 ItemsPanelTemplate 声明为 Canvas,如

<ItemsControl>
   <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
         <Canvas/>
      </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
</ItemsControl>

我还发现我需要在 ItemTemplate 中放一些东西(不确定是什么),就像这样。. .

  <ItemsControl.ItemTemplate>
     <DataTemplate>
         <!--  Don't know what goes here -->
     </DataTemplate>
  </ItemsControl.ItemTemplate>

我的问题

有人可以建议我在 DataTemplate 中放入什么,以便我可以绑定到我的 ViewModel 并让 ViewModel 绘制文本(任何旋转、任何字体等)、线条、弧线、贝塞尔曲线、形状 - - - 根据绑定集合中的各种元素,我需要什么?

我的猜测是它应该是一个 System.Windows.FrameworkTemplate,但我仍在试图弄清楚如何使用它,而且进展缓慢。或者可能是 ContentControl 和 Presenter?

参考

使用 ItemsControl 时如何将 X/Y 位置转换为 Canvas Left/Top 属性

如何在 ItemsControl 中定位 ViewModel

是否可以在 XAML 中绑定 Canvas 的 Children 属性? 注意:请参阅此问题的第二个答案。

4

1 回答 1

2

有不同的方法。

您可以根据选择器切换 DataTemplates。

public class ImgStringTemplateSelector : DataTemplateSelector
{
  public DataTemplate ImageTemplate { get; set; }
  public DataTemplate StringTemplate { get; set; }

  public override DataTemplate SelectTemplate(object item,
    DependencyObject container)
  {
    String path = (string)item;
    String ext = System.IO.Path.GetExtension(path);
    if (System.IO.File.Exists(path) && ext == ".jpg")
      return ImageTemplate;
    return StringTemplate;
  }

您可以通过 ItemsPanel ItemTemplateSelector 来引用它。Sch as ItemTemplateSelector="{StaticResource ImgTemplateSelector}"。在那里,您选择要返回的模板。

你可以返回 Line 模板、Arc 模板等。这很简单。

另一个技巧是您可以拥有基类 DrawingObject 并从中派生。如 ArcObj : DrawingObject,

稍后您只需添加

<DataTemplate Datatype="{x:Type ArcObj"}>
<Arc Canvas.Left="{BInding X}", Canvas.Top="{Binding Y}" />
</DataTemplate>

等等。

于 2012-10-08T06:00:16.567 回答