<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>
这是在其他文件中...
<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>
而...
public partial class ElementType : System.Windows.Controls.Grid { }
一切工作正常,但第二个元素。
我得到的错误:
无法设置元素“的ElementType”的名称属性值“SecondElementName”。 “的ElementType”是要素的范围“的ElementType”,它已经有,当它在另一个范围被定义注册的名称下。
自定义网格正确定义。 该代码将编译,如果我拿出酒店内运行的---
x:Name="SecondElementName"
---在Window1.xaml
是什么原因造成这个错误? 如何避开它? 我需要嵌套另一个里面这些自定义网格中的一个,我需要他们两人的名字,所以我可以绑定他们单独的数据。
提前致谢。
为了知道如何使用嵌套标记物尽,XAML解析器会,除其他事项外,看看.NET类是否定义了默认的“内容”属性作为这些儿童的容器来使用。 这与“ContentPropertyAttribute”来完成。
在你的情况,因为我想你想嵌套的对象去网格内,由于网格的孩子的“儿童”的属性集合中去,你只需要做到以下几点:
[ContentProperty("Children")]
public partial class ElementType : Grid
{
// your code here...
}
如果你需要做一些逻辑将孩子的控制(如只允许某些类型是你的ElementType控制的孩子),你可以而不是从IAddChild继承,并实现的AddChild和AddText方法。
对于命名的问题,似乎只有无外观的控件可以有一个名为在实例化的范儿。 所以基本上,你可以有一个名为儿童中ElementType.xaml,但不能命名为其他标记的孩子你实例的ElementType。 我想这是因为他们的方式优化逻辑树什么的。 甲无外观控制,在另一方面,是只用码的控制。 所以,如果你把你的班级分成网格的一个普通的老空的子类,它的工作原理:
public class ElementType : Grid
{
}
好极了! 更少的代码!
如果你想在另一个内,你会希望把第一的内容属性内一个:
<local:ElementType x:Name="FirstElementName">
<local:ElementType.Content>
<local:ElementType x:Name="SecondElementName" Grid.Column="1" Grid.Row="1" />
</local:ElementType.Content>
</local:ElementType>
此外,我不知道你是想在这里完成的任务,但我担心它。
如果你不希望改变用户控件,使用附加的行为。 所以,你只需要它在那里,在XAML编译失败! 只有1种行为每个用户控件,这使得麻烦。
在XAML:
<preview:PreviewControl>
<i:Interaction.Behaviors>
<behaviors:UserControlNameBehavior Name="ICanSetNames"/>
</i:Interaction.Behaviors>
</preview:PreviewControl>
在C#中:
public class UserControlNameBehavior : Behavior<UserControl>
{
public string Name { get; set; }
protected override void OnAttached()
{
this.AssociatedObject.Loaded += OnLoaded;
base.OnAttached();
}
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
this.AssociatedObject.Name = this.Name;
}
}