让我们说我有一个名为“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感兴趣。
答案 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;。