请给我一个ItemsControl子类 - 请使用ItemsPresenter

时间:2010-07-13 09:39:00

标签: c# wpf styles itemscontrol

我有一个来自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确定,该<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> 被调用并且位置已正确确定。精确的姿势是在覆盖中确定的。不过,我在造型方面很丢失。我根本无法让物品出现。在Generic.xaml中,我定义了样式。他们工作,但不是他们应该:

ItemsPresenter

在这里,几乎在表示树中,ItemsPresenter是最低元素。 Canvas的子元素从未出现过。我还尝试将ControlTemplate放入IsItemsHost="true" WorkSheet -> Border -> ItemsPresenter - 再次,没有任何项目。任何人都知道我在这里做错了什么?

再次,作为解释 - 我将断点放入表单上的按钮处理程序,并使用Visualizer查看可视树。我得到的层次结构是:

ControlTemplate ......以下没有。

显然这意味着使用ItemsPanel,但永远不会调用{{1}}。

1 个答案:

答案 0 :(得分:1)

在ControlTemplate中放置一个TargetType:

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

不起作用;)

更新2:

我在侧面项目中复制了你的东西,你有两个问题:

第一个问题是你的Style中的ItemTemplate setter会触发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>