在大多数情况下,将它们放入ControlTemplate或DataTemplate中效果最好。以下是ControlTemplate方法:
<ResourceDictionary>
<ControlTemplate x:Key="MyShape">
<Grid With="..." Height="...">
<Rectangle ... />
<Ellipse ... />
<Path ... />
</Grid>
</ControlTemplate>
</ResourceDictionary>
...
<Canvas ...>
<Control Template="{StaticResource MyShape}" ... />
<Control Template="{StaticResource MyShape}" ... />
<Control Template="{StaticResource MyShape}" ... />
<Control Template="{StaticResource MyShape}" ... />
</Canvas>
数据模板方式:
<ResourceDictionary>
<DataTemplate x:Key="MyShape">
<Grid With="..." Height="...">
<Rectangle ... />
<Ellipse ... />
<Path ... />
</Grid>
</DataTemplate>
</ResourceDictionary>
...
<Canvas ...>
<ContentPresenter ContentTemplate="{StaticResource MyShape}" ... />
<ContentPresenter ContentTemplate="{StaticResource MyShape}" ... />
<ContentPresenter ContentTemplate="{StaticResource MyShape}" ... />
<ContentPresenter ContentTemplate="{StaticResource MyShape}" ... />
</Canvas>
要在这些功能之间进行选择,请决定您需要什么附加功能(如果有)。您可能希望向控件或数据对象添加属性。
-
如果使用ControlTemplate,则自定义控件可以参与属性继承并成为可视树的一部分,接收所有事件。您还可以在绑定中引用DataContext和TemplatedParent,这更为灵活。
-
如果使用数据模板,则可以直接针对模型中的对象进行工作。
您也可以使用itemsControl及其子类(列表框、组合框等)来适当地显示形状,而不是列出单个控件。
替代方法
另一种完全不同的方法是将形状集合转换为绘图对象,并使用DrawingImage或DrawingBrush呈现它。