Wpf 将线条、文本等数据绑定到项控件,用于画布上类似cad的矢量绘图

Wpf 将线条、文本等数据绑定到项控件,用于画布上类似cad的矢量绘图,wpf,data-binding,mvvm,canvas,itemscontrol,Wpf,Data Binding,Mvvm,Canvas,Itemscontrol,使用MVVM模式,我希望像矢量CAD应用程序一样,将行和文本写入画布。在研究这一点时,我得出结论,我需要使用ItemsControl,并将ItemsPanelTemplate声明为画布,如中所示 <ItemsControl> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Canvas/> </ItemsPanelTemplate> &

使用MVVM模式,我希望像矢量CAD应用程序一样,将行和文本写入画布。在研究这一点时,我得出结论,我需要使用ItemsControl,并将ItemsPanelTemplate声明为画布,如中所示

<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

工具书类


注意:请参见第二个答案。

有不同的方法

您可以根据选择器切换数据模板

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 IMGTTemplateSelector}”。在这种情况下,您可以选择要返回的模板

可以返回直线模板、圆弧模板等。。 这很容易

另一个技巧是可以使用基类DrawingObject并从中派生。例如ArcObj:DrawingObject

稍后你只需添加

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


等等。

谢谢你,克里斯。我目前正在实施这一建议。我在上找到了完全相同的示例代码(您的第一个建议),您不应该给出您复制代码的地方的参考吗?也许你看到了,但我看不到。WebArchive文章的链接-(以防有人需要更多信息)