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