还在学习XAML / WPF。如果有人能告诉我如何完成以下任务 - 这将有助于我开发下一个项目(以及未来的几个类似项目)。
假设我有一组对象,用于定义要在画布上绘制的对象。对象包含渲染对象所需的所有信息,包括形状,颜色和位置。是否可以创建绑定到此集合并处理渲染的XAML控件,或者通过在代码隐藏中的画布上绘制来更好地完成此操作?
另一点 - 对象最终必须是可点击选择的,可通过矩形套索选择,并可拖动。这不需要在某人提供的示例代码中解决,但我认为可能与此有关,因为它可能会影响各种实现。
下面的示例课程。提前谢谢。
Class DrawingElement
readonly property Shape as string ("circle", "square", "triangle")
readonly property Position as point (coordinates)
readonly property Color as string ("red", "blue", "yellow")
end class
Sub Main
dim lst as new List(of DrawingElement)
lst.add(new DrawingElement("Circle", 10,20, "Blue"))
lst.add(new DrawingElement("Square", 80,35, "Red"))
lst.add(new DrawingElement("Triangle", 210,120, "Yellow"))
<draw lst!>
End Sub
答案 0 :(得分:2)
可以完成,但不能像你的例子那样使用魔术字符串(例如“circle”)。
首先,您应该基于现有的框架元素设计您的models,而不是设计模型,其中包含一些新的UI元素或者努力create code that interprets between them的想法。
WPF已经有一个椭圆(圆圈),矩形(正方形)和一系列其他几何图元供您使用。您将需要创建包含公共可绑定属性的模型,您可以将这些属性绑定到这些元素的实例以控制它们的形状和位置。
没有详细介绍(或测试),我会做这样的事情
public class GeometricElement : INotifyPropertyChanged
{
// these are simplified and don't show INPC code
public double Left {get;set;}
public double Top {get;set;}
public Brush Fill {get;set;}
// ...
}
// ...
public class Square : GeometricElement
{
public double Width {get;set;}
public double Height {get;set;}
}
// ...
// bound to the window
public class CadAppDataContext
{
public ObservableCollection<GeometricElement> Elements {get; private set;}
}
在我的xaml中,它看起来像
<ItemsControl ItemsSource="{Binding Source={StaticResource cadAppDataContext}}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Resources>
<DataTemplate TargetType="{x:Type me:Square}">
<Rectangle
Canvas.Left="{Binding Left}"
Canvas.Top="{Binding Top}"
Width="{Binding Width}"
Height="{Binding Height}"
Fill="{Binding Fill}" />
</DataTemplate>
<!-- more DataTemplates for circle, triangle, etc etc -->
</ItemsControl.Resources>
</ItemsControl>
ItemsControl将创建一个Canvas元素,对于Elements集合中的每个GeometricElement,它将根据Elements中对象的类型添加一个新的子UI元素。
项控件绑定到集合,可以根据代码中集合中发生的内容添加或删除元素。它通过查找为特定Type设计的DataTemplate来确定要添加的UI元素。这是一种常见且重要的模式,这就是为什么使用魔法弦会长期伤害你的原因;神奇的字符串路由不会让你利用已经内置到WPF中的框架的强大功能。
现在,我不是说这可以开箱即用。如果没有一些繁重的工作,你可能会遇到无法绑定的属性。您甚至可能需要扩展几何图元以使它们按您想要的方式运行。但这是WPF应用程序中使用的模式。了解模式并使用它将帮助您避免数小时的压力和失败。