【问题标题】:WPF .NET4.0 re-use same instance of UserControlWPF .NET4.0 重用 UserControl 的相同实例
【发布时间】:2011-05-24 03:10:21
【问题描述】:

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

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

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

我想达到的目标有可能吗?

谢谢,

【问题讨论】:

    标签: c# wpf .net-4.0


    【解决方案1】:

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

    如果您正在使用 MVVM 模式(或者只是在一般情况下使用 DataBinding),那么您可以将两个不同的 UserControl 绑定到相同的支持 ViewModel/数据,以便控件的行为相同并在相同的状态表示上运行。不过,您仍然需要两个不同的控件。

    【讨论】:

    • 这成功了。绑定到同一个数据源(查看模型)干杯。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2013-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-16
        • 2014-02-07
        • 2013-11-17
        相关资源
        最近更新 更多