Справка по производному пользовательскому элементу управления WPF ItemsControl - PullRequest
2 голосов
/ 03 мая 2011


Я хотел бы написать производный пользовательский элемент ItemsControl. Это частично из-за необходимости, а частично как учебное упражнение - пожалуйста, не предлагайте I Style, DataTemplate, ControlTemplate a ListBox и т. Д. Т.е. пожалуйста, не подвергайте сомнению необходимость - просто примите ее подлинную.
Я троллил в Интернете и нашел много полезной информации ItemControl, но нет четких примеров. Когда я создаю новый пользовательский элемент управления в VS, я получаю практически пустой код и Generic.xaml с блоком <Style>, где можно установить ControlTemplates, DataTemplates, Presenters и т. Д. С помощью <Setter Property="Template"> и т. Д. Но каков минимальный xaml / код нужно здесь, чтобы получить элемент управления, который будет привязан к ObservableCollection для ItemsSoruce для отображения в виде списка? Другими словами: какова каноническая форма пользовательского элемента управления, полученного из ItemsControl?
Нужен ли ItemsPresenter? Нужно ли указывать панель стека в ControlTemplate? Нужно ли устанавливать TargetType на <Setter Property="ItemTemplate">? и т.д.
Подача ложки предпочтительнее, например, говоря: это просто, и мне просто нужно интегрировать DataTemplate в векторное пространство контейнеров элементов управления по отношению к ведущему панели yada yada ... не очень помогает. Дополнительная информация: Элемент управления ориентирован только на отображение, т. Е. Отсутствует концепция выбранного элемента и т. Д. Заранее спасибо!

Generic.xaml по умолчанию (какой минимум здесь добавить?):

<Style TargetType="{x:Type local:MyItemsControlDerivedClass}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyItemsControlDerivedClass}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">        

                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

Просто взгляните на стили по умолчанию (перейдите по ссылке Default WPF Themes):

например, ListBox:

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type ListBox}">
            <Border Name="Bd"
                    Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    SnapsToDevicePixels="true"
                    Padding="1">
                <ScrollViewer Padding="{TemplateBinding Padding}"
                              Focusable="false">
                    <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                </ScrollViewer>
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="IsEnabled"
                         Value="false">
                    <Setter TargetName="Bd"
                            Property="Background"
                            Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                </Trigger>
                <Trigger Property="IsGrouping"
                         Value="true">
                    <Setter Property="ScrollViewer.CanContentScroll"
                            Value="false"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Setter.Value>
</Setter>
0 голосов
/ 04 мая 2011

Добавление стиля по умолчанию, так как HB предлагает работать и делает элемент управления доступным (отображение элементов).Удаление ItemsPresenter (внутри ScrollViewer) нарушает управление (без отображения контента).В этом посте объясняется, что происходит: http://drwpf.com/blog/2009/05/12/itemscontrol-l-is-for-lookless/
По существу ControlTemplate должен иметь:
a) ItemPresenter ИЛИ
b) панель со свойством IsItemsHost, установленным в true.
Т.е. необходимый минимум, который вам нужендобавить в стиль ControlTemplate с:
<StackPanel IsItemsHost="True" />
ИЛИ
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>

...