2010-06-04 67 views
3

我创建了一个使用基本形状的复杂形状。我想在画布上使用多个这样的代码,在代码后面以编程方式创建。WPF复合形状

我曾想过创建一个UserControl,但封装这个复合形状的最好方法是什么?

回答

1

对于大多数情况下,将它们放在ControlTemplate或DataTemplate中效果最好。这里的控件模板的方式:

<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> 

而DataTemplate的方式:

<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,这更加灵活。
  • 如果使用DataTemplate,可以直接针对模型中的对象工作。

除了列出单独的控件,您还可以使用ItemsControl及其子类(ListBox,ComboBox等)来适当地呈现您的形状。

替代方法

另一种完全不同的方式对你的形状的集合转换为图形对象,并使用DrawingImage或DrawingBrush出示。