首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >请为我设计一个ItemsControl子类--使用ItemsPresenter

请为我设计一个ItemsControl子类--使用ItemsPresenter
EN

Stack Overflow用户
提问于 2010-07-13 17:39:00
回答 1查看 1K关注 0票数 1

我有一个名为WorkSheet的控件,它是ItemsControl的子类

代码语言:javascript
复制
public sealed class WorkSheet : ItemsControl {

它的元素被强制为WorkTiles

代码语言:javascript
复制
    /// <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中,我已经定义了样式。它们可以工作,但并不像它们应该的那样:

代码语言:javascript
复制
<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的子元素永远不会出现。我还尝试使用IsItemsHost="true"Canvas放入ControlTemplate中-同样,没有任何项。有人知道我做错了什么吗?

同样,作为解释-我在表单上的按钮处理程序中放置了一个断点,并使用Visualizer查看可视化树。我得到的层次结构是:

WorkSheet -> Border -> ItemsPresenter ...下面什么都没有。

显然,这意味着使用了ControlTemplate,但从未调用过ItemsPanel

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-13 17:48:18

在你的ControlTemplate中也放置一个TargetType:

代码语言:javascript
复制
<ControlTemplate TargetType="{x:Type local:WorkSheet}">

不工作;)

更新2:

我在一个辅助项目中复制了你的东西,你有两个问题:

第一个问题是您的风格中的ItemTemplate设置器,它将触发StackOverflow异常(多么讽刺;)。删除ContentPresenter,删除整个模板或使用密钥。

第二个问题是GetContainerForItemOverride方法。删除此方法将在屏幕上显示内容!

下面是我的代码:

代码语言:javascript
复制
public sealed class WorkSheet : ItemsControl
{
    /// <inheritdoc />
    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return (item is WorkTile);
    }

}

和带有样式的窗口的xaml:

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3235876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档