如何嵌套自定义XAML元素?

Gif*_*guy 6 wpf grid xaml nested .net-3.5

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window1">
    <Grid>
        <local:ElementType x:Name="FirstElementName">
            <local:ElementType x:Name="SecondElementName" Grid.Column="1" Grid.Row="1" />
        </local:ElementType>
    </Grid>
</Window>  
Run Code Online (Sandbox Code Playgroud)

这是在其他文件...

<Grid x:Name="InternalElementName" x:Class="WpfApplication1.ElementType"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1">
</Grid>  
Run Code Online (Sandbox Code Playgroud)

而......

public partial class ElementType : System.Windows.Controls.Grid { }  
Run Code Online (Sandbox Code Playgroud)

一切都很好,除了第二个元素.
我收到错误:
无法在元素'ElementType'上设置Name属性值'SecondElementName'.'ElementType'在元素'ElementType'的范围内,该元素在另一个范围中定义时已经注册了名称.

自定义网格已正确定义.如果我取出属性,代码将编译并运行---

x:Name="SecondElementName"  
Run Code Online (Sandbox Code Playgroud)

---在Window1.xaml中

导致此错误的原因是什么?我该如何解决这个问题?我需要将其中一个自定义网格嵌套在另一个中,我需要两个名称,以便将它们绑定到单独的数据.

提前致谢.

Lud*_*ant 5

为了知道如何处理嵌套标记对象,XAML解析器将查看.NET类是否定义了一个默认的"content"属性,以用作此类子对象的容器.这是通过"ContentPropertyAttribute"完成的.

在您的情况下,因为我猜您希望嵌套对象进入网格,并且由于网格的子项进入"子"属性集合,您只需要执行以下操作:

[ContentProperty("Children")]
public partial class ElementType : Grid
{
    // your code here...
}
Run Code Online (Sandbox Code Playgroud)

如果在向控件中添加子项时需要执行某些逻辑(例如,只允许某些类型为ElementType控件的子项),则可以继承IAddChild,并实现AddChild和AddText方法.

至于命名问题,似乎只有无外观控件可以在实例范围内具有命名子项.基本上,您可以在ElementType.xaml中命名子项,但在实例化ElementType的其他标记中不能命名子项.我想这是因为他们优化逻辑树或其他东西的方式.另一方面,无外观控制是仅具有代码的控件.因此,如果您将您的类转换为Grid的一个普通的旧空子类,它的工作原理如下:

public class ElementType : Grid
{
}
Run Code Online (Sandbox Code Playgroud)

好极了!更少的代码!