WPF .NET4.0重用UserControl的同一实例

问题描述

| 我想两次显示相同的用户控件实例。香港专业教育学院试图做以下事情:
<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将其“绘制”到另一个控件上。     ,您不能在两个地方拥有相同的控件,但是要使其跳跃,请参阅我的答案以获取有关如何执行此操作的示例。