WPF .NET4.0 重用用户控件的相同实例

本文关键字:实例 控件 用户 NET4 WPF | 更新日期: 2023-09-27 17:57:23

我想显示两次相同的用户控件实例。我尝试执行以下操作:

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

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

我试图实现的目标可能吗?

谢谢

WPF .NET4.0 重用用户控件的相同实例

不是。正如错误所示,给定对象可能只出现在给定的逻辑树中一次。这有助于确保逻辑树保持树。

如果您使用的是 MVVM 模式(或者只是一般地使用 DataBinding),则可以将两个不同的 UserControls 绑定到相同的后备 ViewModel/data,以便控件的行为相同并在相同的状态表示形式上运行。但是,您仍然需要两个不同的控件。

在 WPF(和 Silverlight)中,控件不能位于可视化树中的多个位置。您可以做的是拥有用户控件的两个单独实例,但将它们的相关属性绑定到同一基础源。

例如,假设您有一个联系人对象,并且您希望两个 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 将"绘制"到另一个控件上。

你不能在两个地方有相同的控制,但你让它跳跃,请参阅我的这个答案,了解如何做到这一点。