WPF .NET4.0 повторно использовать тот же экземпляр UserControl - PullRequest
9 голосов
/ 24 мая 2011

Я хотел бы отобразить один и тот же экземпляр пользовательского контроля дважды.Я пытался сделать следующее:

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

8 голосов
/ 24 мая 2011

В 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 для «рисования» на другом элементе управления.

7 голосов
/ 24 мая 2011

Это не так. Как указывает ошибка, данный объект может присутствовать только в данном логическом дереве один раз . Это помогает гарантировать, что логическое дерево остается деревом .

Если вы используете шаблон MVVM (или вообще используете DataBinding), то вы можете связать два разных элемента UserControl с одной и той же основой ViewModel / data, так что элементы управления будут вести себя одинаково и работать на том же государственном представительстве. Вам все равно понадобятся два разных элемента управления.

0 голосов
/ 24 мая 2011

Вы не можете иметь один и тот же элемент управления в двух местах, но вы заставляете его прыгать, см. мой ответ мой пример того, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...