代码之家  ›  专栏  ›  技术社区  ›  Indy9000

WPF复合形状

  •  3
  • Indy9000  · 技术社区  · 14 年前

    我使用基本形状创建了一个稍微复杂的形状。我想在画布上使用它的倍数,在代码隐藏中以编程方式创建。

    我已经考虑过创建一个用户控件,但是封装这个复合形状的最佳方法是什么?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Ray Burns    14 年前

    在大多数情况下,将它们放入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呈现它。