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

时间:2011-05-24 03:10:22

标签: c# wpf .net-4.0

我想两次显示相同的用户控件实例。我尝试过以下方法:

<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>

我收到错误消息: “{”指定的元素已经是另一个元素的逻辑子元素。首先断开它。“}”

我想要实现的目标是什么?

谢谢,

3 个答案:

答案 0 :(得分:8)

在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“绘制”到另一个控件上。

答案 1 :(得分:7)

不是。如错误所示,给定对象可能仅出现在给定的逻辑树。这有助于确保逻辑树仍然是

如果你正在使用MVVM模式(或者一般只使用DataBinding),那么可以将两个不同的UserControl绑定到相同的后备ViewModel / data,这样控件就会表现出来相同并且在相同的状态表示上操作。但是,你仍然需要两个不同的控件。

答案 2 :(得分:0)

你不能在两个地方拥有相同的控制权,但是你可以让它跳跃,请参阅我的this answer以获取如何做到这一点。