问题描述
|
我想两次显示相同的用户控件实例。香港专业教育学院试图做以下事情:
<UserControl.Resources>
<Views:MyControl View x:Key=\"_uc1\" MinHeight=\"300\"/>
</UserControl.Resources>
并尝试在TabControl中使用它:
<TabControl Grid.Row=\"3\" Grid.Column=\"1\" Grid.ColumnSpan=\"3\" >
<TabItem >
<TabItem.Header>
<TextBlock Text=\"Header1\" FontWeight=\"13\"/>
</TabItem.Header>
<StackPanel >
<ContentControl Content=\"{StaticResource _uc1}\"/>
</StackPanel>
</TabItem>
<TabItem >
<TabItem.Header>
<TextBlock Text=\"Header2\" FontWeight=\"13\"/>
</TabItem.Header>
<StackPanel MinHeight=\"600\" >
<ContentControl Content=\"{StaticResource _uc1}\"/>
</StackPanel>
</TabItem>
</TabControl>
我收到错误消息:
\“ {\”指定的元素已经是另一个元素的逻辑子元素。首先断开连接。\“} \”
我试图实现的目标有可能吗?
谢谢,
解决方法
不是。如错误所示,给定对象只能在给定逻辑树中出现一次。这有助于确保逻辑树仍然是树。
如果您使用的是MVVM模式(或通常只使用DataBinding),则可以将两个不同的UserControl绑定到相同的支持ViewModel / data,以便控件将表现相同并以相同的状态表示进行操作。不过,您仍然需要两个不同的控件。
,在WPF(和Silverlight)中,控件不能位于可视化树中的多个位置。您可以做的是拥有两个单独的用户控件实例,但是将它们的相关属性绑定到相同的基础源。
例如,假设您有一个Contact对象,并且想要两个MyControl实例引用相同的FullName属性。
<UserControl>
<UserControl.Resources>
<my:Contact x:Key=\"data\" FullName=\"Josh Einstein\" />
</UserControl.Resources>
<TabControl DataContext=\"{StaticResource data}\">
<TabItem>
<TabItem.Header>
<TextBlock Text=\"Header1\" FontWeight=\"13\" />
</TabItem.Header>
<StackPanel>
<!-- instance #1 -->
<Views:MyControl FullName=\"{Binding FullName,Mode=TwoWay}\" />
</StackPanel>
</TabItem>
<TabItem>
<TabItem.Header>
<TextBlock Text=\"Header2\" FontWeight=\"13\" />
</TabItem.Header>
<StackPanel>
<!-- instance #2 -->
<Views:MyControl FullName=\"{Binding FullName,Mode=TwoWay}\" />
</StackPanel>
</TabItem>
</TabControl>
</UserControl>
如果只希望单个控件出现在视觉树中的多个位置,而不是实际上是交互式的,则可以使用VisualBrush将其“绘制”到另一个控件上。
,您不能在两个地方拥有相同的控件,但是要使其跳跃,请参阅我的答案以获取有关如何执行此操作的示例。