我有一個UWP-應用程序中,我創建了一個模板化控件「支架」,它包含一個DependencyProperty聲明如下:在XAML中設置的類型ObservableCollection <T>的DependencyProperty包含的項目多於聲明的項目。 C#
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>
(注:兩個類「支架」和「TextBlock的」從「BASECONTROL」派生)
但是當我試圖在這樣的托架添加一個支架:
<Math:Bracket>
<Math:Bracket>
<Math:Bracket.Content>
<Math:TextBlock Text="4" />
<Math:TextBlock Text="x" />
</Math:Bracket.Content>
</Math:Bracket>
</Math:Bracket>
我得到一個異常:「元素已經是另一個元素的子」
一些調試後我發現,在每兩個支架的對象的屬性內容包含3個元素:兩個的TextBlocks和內托架。
我所期望的和我想要的是,外部括號的內容僅包含內部括號,而內部括號的內容僅包含兩個TextBlocks。
由於面板例如。一個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(呈現內容的開始和結束括號) – Hannes