WPF: несколько предъявителей контента в пользовательском элементе управления? - PullRequest
12 голосов
/ 18 февраля 2011

Я пытаюсь создать пользовательский элемент управления, который требует, чтобы 2 или более областей XAML были определены дочерним элементом управления - который наследуется от этого элемента управления. Мне интересно, есть ли способ определить несколько предъявителей контента и один, который действует как предъявитель контента по умолчанию

<MyControl>
      <MyControl.MyContentPresenter2>
           <Button Content="I am inside the second content presenter!"/>
      </MyControl.MyContentPresenter2>

      <Button Content="I am inside default content presenter" />
</MyControl>

Возможно ли это, как мне определить это в шаблоне пользовательского элемента управления?

Ответы [ 3 ]

13 голосов
/ 18 февраля 2011

Шаблон может просто привязать отдельные ContentPresenter экземпляры, как это (я только установил одно свойство здесь, но вы, вероятно, захотите установить другие):

<ContentPresenter Content="{TemplateBinding Content1}"/>
<ContentPresenter Content="{TemplateBinding Content2}"/>

Элемент управления должен выставлять самдва свойства для содержимого и установите значение по умолчанию, используя ContentPropertyAttribute:

[ContentProperty("Content1")]
public class MyControl : Control
{
    // dependency properties for Content1 and Content2
    // you might also want Content1Template, Content2Template, Content1TemplateSelector, Content2TemplateSelector
}
6 голосов
/ 22 апреля 2011

Вы можете использовать "ItemsControl" с пользовательским шаблоном.

<ItemsControl>
    <ItemsControl.Style>
        <Style TargetType="ItemsControl">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ContentControl Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Items[0]}"/>
                            <ContentControl Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Items[1]}"/>
                            <ContentControl Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Items[2]}"/>
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ItemsControl.Style>
    <TextBlock Text="Item 1"/>
    <TextBlock Text="Item 2"/>
    <TextBlock Text="Item 3"/>
</ItemsControl>
3 голосов
/ 21 сентября 2011

Вот еще один вариант, который не требует создания пользовательского элемента управления и является более безопасным с точки зрения типов, чем выполнение вещи ItemsControl (если безопасность типов - это то, что вы хотите ... возможно, нет):

... Использовать прикрепленное свойство!

Создайте вложенное свойство соответствующего типа. Нам понадобился текстовый элемент управления, поэтому я добавил свойство TextContent в виде строки. Затем создайте TemplateBinding к нему из шаблона, и при создании экземпляра в Xaml установите его там же. Работает красиво.

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