使用MVVM模式我想将行和文本写入Canvas,就像矢量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?
How to convert X/Y position to Canvas Left/Top properties when using ItemsControl
How can I position ViewModels in an ItemsControl
Is it possible to bind a Canvas's Children property in XAML? 注意:请参阅第二个答案。
答案 0 :(得分: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>
等等。