我如何在userControl中嵌套其他控件?

时间:2014-04-15 03:22:45

标签: wpf vb.net xaml

让我们说我有一个名为“zoomBox”的uc,它包含一些功能按钮和一个用于放置嵌套内容的网格。我如何让wpf明白网格是我想要嵌套标签的位置?默认情况下,我只是得到一些错误“无法在另一个东西的范围内设置名称属性”。举个例子,这是uc:

<UserControl x:Class="zoomBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">

    <Grid>
        <Grid x:name="this is where nested stuff is supposed to go"/>
        ..some other hypothetical things
    </Grid>
</UserControl>

这就是我想用它的方式

    <local:zoomBox>
        <StackPanel x:Name="stackPanelThatNeedsZooming!" />
    </local:zoomBox>

注意:尽管使用了网格,我只对将一个子节点添加到zoomBox感兴趣。

1 个答案:

答案 0 :(得分:3)

  

尽管使用了网格,但我只对将一个孩子添加到zoomBox

感兴趣

这是ContentPresenter的用途。

并且,由于您已经在声明UserControl的同一个XAML中设置了UserControl&#39; Content,所以:

<UserControl...>
    <SomeContent/>
</UserControl>

您无法定义内容两次。这就是您收到错误的原因。

除此之外,您必须Template控件,以便它支持预定义内容和&#34;占位符&#34;将放置新内容的地方:

<UserControl x:Class="YourNamespace.zoomBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:YourNamespace"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Template>
        <ControlTemplate TargetType="{x:Type local:zoomBox}">
            <Grid>
               <ContentPresenter ContentSource="Content" 
                                 x:Name="This is where your nested content will go"/>
              ..some other hypothetical things
            </Grid>
        </ControlTemplate>
    </UserControl.Template>
</UserControl>

请注意,我添加了一个额外的xmlns,该zoomBox映射到定义了TargetType类的CLR命名空间,以便能够定义ControlTemplate的{​​{1}}

有关详细信息,请参阅MSDN: WPF Content Model

顺便说一句,请使用正确的命名约定,它应该是ZoomBox大写&#34; Z&#34;。