我怎么能窝自定义XAML元素?(How Can I Nest Custom XAML Element

2019-09-20 12:02发布

<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

是什么原因造成这个错误? 如何避开它? 我需要嵌套另一个里面这些自定义网格中的一个,我需要他们两人的名字,所以我可以绑定他们单独的数据。

提前致谢。

Answer 1:

为了知道如何使用嵌套标记物尽,XAML解析器会,除其他事项外,看看.NET类是否定义了默认的“内容”属性作为这些儿童的容器来使用。 这与“ContentPropertyAttribute”来完成。

在你的情况,因为我想你想嵌套的对象去网格内,由于网格的孩子的“儿童”的属性集合中去,你只需要做到以下几点:

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

如果你需要做一些逻辑将孩子的控制(如只允许某些类型是你的ElementType控制的孩子),你可以而不是从IAddChild继承,并实现的AddChild和AddText方法。

对于命名的问题,似乎只有无外观的控件可以有一个名为在实例化的范儿。 所以基本上,你可以有一个名为儿童中ElementType.xaml,但不能命名为其他标记的孩子你实例的ElementType。 我想这是因为他们的方式优化逻辑树什么的。 甲无外观控制,在另一方面,是只用码的控制。 所以,如果你把你的班级分成网格的一个普通的老空的子类,它的工作原理:

public class ElementType : Grid
{
}

好极了! 更少的代码!



Answer 2:

如果你想在另一个内,你会希望把第一的内容属性内一个:

<local:ElementType x:Name="FirstElementName">
    <local:ElementType.Content>
        <local:ElementType x:Name="SecondElementName" Grid.Column="1" Grid.Row="1" />
    </local:ElementType.Content>
</local:ElementType>

此外,我不知道你是想在这里完成的任务,但我担心它。



Answer 3:

如果你不希望改变用户控件,使用附加的行为。 所以,你只需要它在那里,在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;
        }
    }


文章来源: How Can I Nest Custom XAML Elements?