我正在使用此站点中的示例来创建 MultiColumnStackPanel。
然而有一个问题。加载页面后,堆栈面板看起来很好,与示例完全相同。但是当我导航到下一页然后返回上一页时,我得到了一个例外:
无效操作异常带有以下消息:
元素已经是另一个元素的子元素。
.
所以我认为原始自定义堆栈面板中包含的项目正在添加到新的自定义堆栈面板中。但是,为什么MultiColumnStackPanel被“刷新”并且MultiColumnStackPanel.Items仍然存在?
还有其他人对此问题有解释/解决方案吗?
提前致谢
.
MultiColumnStackPanel 类:
public class MultiColumnStackPanel : StackPanel
{
public int NumberOfColumns { get; set; }
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register("Items",
typeof(Collection<UIElement>),
typeof(MultiColumnStackPanel),
new PropertyMetadata(new Collection<UIElement>()));
public Collection<UIElement> Items
{
get { return (Collection<UIElement>)GetValue(ItemsProperty); }
}
public MultiColumnStackPanel()
{
Loaded += (s, e) =>
{
LoadItems();
};
}
void LoadItems()
{
Children.Clear();
if (Items != null)
{
StackPanel sp = CreateNewStackPanel();
foreach (UIElement item in Items)
{
sp.Children.Add(item);
if (sp.Children.Count == NumberOfColumns)
{
Children.Add(sp);
sp = CreateNewStackPanel();
}
}
if (sp.Children.Count > 0)
Children.Add(sp);
}
}
private StackPanel CreateNewStackPanel()
{
Orientation oppositeOrientation;
if(this.Orientation.Equals(Orientation.Vertical))
oppositeOrientation = Orientation.Horizontal;
else
oppositeOrientation = Orientation.Vertical;
return new StackPanel() { Orientation = oppositeOrientation };
}
}
xml 示例:
<model:MultiColumnStackPanel x:Name="customStackPanel" Orientation="Horizontal" NumberOfColumns="2">
<model:MultiColumnStackPanel.Items>
<Rectangle Height="80" Width="80" Margin="10" Fill="Green" />
<Rectangle Height="80" Width="80" Margin="10" Fill="Green" />
<Rectangle Height="80" Width="80" Margin="10" Fill="Green" />
<Rectangle Height="80" Width="80" Margin="10" Fill="Green" />
</model:MultiColumnStackPanel.Items>
</model:MultiColumnStackPanel>