Присвойте мне подкласс ItemsControl, пожалуйста, зайдите в ItemsPresenter - PullRequest
1 голос
/ 13 июля 2010

У меня есть элемент управления, который имеет подклассы от ItemsControl, называемый WorkSheet:

public sealed class WorkSheet : ItemsControl {

Его элементы должны быть WorkTiles:

    /// <inheritdoc />
    protected override bool IsItemItsOwnContainerOverride(object item) {
        return (item is WorkTile);
    }

    /// <inheritdoc />
    protected override DependencyObject GetContainerForItemOverride() {
        return new WorkTile();
    }

Пока- настолько хорошо.Я хочу, чтобы WorkSheet использовал Canvas для представления WorkItems, позиция определяется путем переопределения ArrangeOverride, который вызывается, и позиции определяются правильно.Точная позиция определяется в переопределениях.Я довольно потерян в моделировании, все же.Я просто не могу заставить предметы появляться.В Generic.xaml я определил стили.Они работают, но не так, как должны:

<Style TargetType="{x:Type local:WorkSheet}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Border>
                    <ItemsPresenter />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <Canvas />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <ContentPresenter />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

Здесь, в значительной степени, в дереве презентаций, ItemsPresenter является самым низким элементом.Субэлементы ItemsPresenter никогда не появляются.Я также попытался вставить Canvas в ControlTemplate с IsItemsHost="true" - опять же, без элементов.Кто-нибудь знает, что я делаю здесь неправильно?

Опять же, в качестве объяснения - я помещаю точку останова в обработчик кнопки на форме и использую визуализатор, чтобы увидеть визуальное дерево.Я получаю иерархию:

WorkSheet -> Border -> ItemsPresenter ... и ничего ниже.

Очевидно, это означает, что используется ControlTemplate, но ItemsPanel никогда не вызывается.

1 Ответ

1 голос
/ 13 июля 2010

Поместите TargetType в свой ControlTemplate, а также:

<ControlTemplate TargetType="{x:Type local:WorkSheet}">

Не работает;)

Обновление 2:

Я скопировал вашвещи в стороннем проекте, и у вас есть две проблемы:

Первая проблема - установщик ItemTemplate в вашем стиле, который вызовет исключение StackOverflow (насколько иронично;)).Удалите ContentPresenter, удалите весь шаблон или используйте ключи.

Вторая проблема - это метод GetContainerForItemOverride.Удаление этого метода даст мне материал на экране!

Вот мой код:

public sealed class WorkSheet : ItemsControl
{
    /// <inheritdoc />
    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return (item is WorkTile);
    }

}

И xaml окна со стилем:

<Window x:Class="WpfApplication8.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfApplication8="clr-namespace:WpfApplication8"
    Title="Window1" Height="300" Width="300">

    <Window.Resources>
        <Style TargetType="{x:Type WpfApplication8:WorkSheet}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate >
                        <Border>
                            <ItemsPresenter />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <Canvas />
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
        </Style>

    </Window.Resources>

    <Grid>
        <WpfApplication8:WorkSheet x:Name="sheet" />
    </Grid>
</Window>
...