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中
导致此错误的原因是什么?我该如何解决这个问题?我需要将其中一个自定义网格嵌套在另一个中,我需要两个名称,以便将它们绑定到单独的数据.
提前致谢.
为了知道如何处理嵌套标记对象,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)
好极了!更少的代码!