如何创建WPF UserControl,将Canvas作为"主面板"?

时间:2014-03-13 19:45:11

标签: xaml canvas wpf-controls controltemplate

我想创建一个内部有Canvas的UserControl。然后我可以在XAML中使用它:

<Window ...>
    <Grid>
        <local:MyCanvasLikeControl>
            <Path .../>
            <Path .../>
            <Polygon.../>
        </local:MyCanvasLikeControl>
     </Grid>
</Window>

我尝试过一些东西,但总是会收到此错误:“属性Content只能设置一次”。我知道ControlTemplates等,但是我自己通过阅读文档找不到自己的方式。

我的目标是拥有与此类似的东西:

<Window ...>
    <Grid ...>
        <Border ....>
             <Canvas ...>
                  <Path ...>
                  <Path ...>
                  <Polygon ...>
             </Canvas>
        </Border>
     </Grid>
 </Window>

但将“Border / Canvas”移动到名为“MyCanvasLikeControl”的UserControl

1 个答案:

答案 0 :(得分:1)

这是一种相同类型的场景,就好像你将任何其他类型的一堆元素填充到一个控件中一样会产生相同的错误,例如;

<UserControl>
   <Grid/>
   <StackPanel/>
   <Canvas/>
   <!-- you get the idea -->
</UserControl>

它只是告诉您,您需要指定一个能够保留您的内容的父级作为其父级的单个内容,在这种情况下,这将是您的控制。所以要解决这个问题,幸运的是很简单;

<local:MyCanvasLikeControl>
   <Grid>
     <Path .../>
     <Path .../>
     <Polygon.../>
   </Grid>
</local:MyCanvasLikeControl>

或者用GridCanvas切换<Border ....> <Canvas ...> <ContentPresenter/> or <ContentControl/> etc. </Canvas> </Border> ,只要它可以托管子元素。希望这会有所帮助。

编辑:

好的,所以我认为要求的定义在解释上可能有点过于复杂。如果我正确地理解你,那么这就是你破产的原因。

你的第一层元素包含你的UserControl,但是你试图将内容插入其中的方式不是可行的方式,你需要通过指定你希望的方式来提供这种能力它将通过ContentPresenter或ContentControl等添加到您的控件中。所以在外部UserControl中更像是这样;

<Window ...>
    <Grid>
        <local:MyCanvasLikeControl>
            <local:MyCanvasLikeControl.Content>
               <Path .../>
               <Path .../>
               <Polygon.../>
            </local:MyCanvasLikeControl.Content>
        </local:MyCanvasLikeControl>
     </Grid>
</Window>

那么你可以按照你想要的方式注入那些东西。

{{1}}

有意义吗?