【发布时间】:2017-04-18 17:37:41
【问题描述】:
我有一个 UWP-App,我在其中创建了一个模板化控件“括号”,其中包含一个声明如下的 DependencyProperty:
public ObservableCollection<BaseControl> Content
{
get { return (ObservableCollection<BaseControl>)GetValue(ContentProperty); }
set
{
SetValue(ContentProperty, value);
addChildren();
}
}
public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register(nameof(Content), typeof(ObservableCollection<BaseControl>),
typeof(Bracket), new PropertyMetadata(new ObservableCollection<BaseControl>()));
在 XAML 中使用这样的控件时,一切正常:
<Math:Bracket>
<Math:Bracket.Content>
<Math:TextBlock Text="4" />
<Math:TextBlock Text="x" />
</Math:Bracket.Content>
</Math:Bracket>
(注意:“Bracket”和“TextBlock”类都派生自“BaseControl”)
但是,当我尝试像这样在括号中添加括号时:
<Math:Bracket>
<Math:Bracket>
<Math:Bracket.Content>
<Math:TextBlock Text="4" />
<Math:TextBlock Text="x" />
</Math:Bracket.Content>
</Math:Bracket>
</Math:Bracket>
我得到一个异常:'元素已经是另一个元素的子元素'
经过一些调试,我发现在两个 Bracket 对象中,属性 Content 包含 3 个元素:TextBlocks 和内部 Bracket。
我所期望和想要的是,外括号的内容仅包含内括号,而内括号的内容仅包含两个文本块。
由于面板例如。 StackPanel 有一个非常相似的功能(它包含孩子,其中一个孩子也可以是 StackPanel 类型)所以我查找了 Panel 类的代码。但是似乎使用了 IAddChild 接口。
在 msdn 文档 (https://msdn.microsoft.com/de-de/library/system.windows.markup.iaddchild(v=vs.110).aspx) 中,据说这是过时的,并且“收集行为现在是 XAML 类型系统的组成部分”。因此,我使用了一个集合,但它产生了不同的结果。
我该如何解决这个问题?或者我应该使用不同的方法来实现这个功能(也许通过使用 IAddChild 接口?
【问题讨论】:
-
addChildren()是什么,它在做什么?我认为它根本不应该存在。 -
addChildren() 将其他一些 UIControls(不是 Content 中的那些)添加到 Control(呈现内容的开始和结束括号)