代码之家  ›  专栏  ›  技术社区  ›  TomTom

请给我一个ItemsControl子类

  •  1
  • TomTom  · 技术社区  · 16 年前

    我有一个从 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();
        }
    

    到目前为止-很好。我想要那个 使用 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>
    

    基本上,在演示树中 ItemsPresenter 是最低的元素。的子元素 永远不会出现。我还试着把 进入 ControlTemplate 具有 IsItemsHost="true"

    同样,作为解释-我将断点放入窗体上的按钮处理程序中,并使用可视化工具查看可视化树。我得到的层次结构是:

    WorkSheet -> Border -> ItemsPresenter

    显然这意味着 使用,但 ItemsPanel

    1 回复  |  直到 7 年前
        1
  •  1
  •   Arcturus    16 年前

    在ControlTemplate中也放置一个TargetType:

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

    更新2:

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

    第一个问题是样式中的ItemTemplate setter将触发StackOverflow异常(多么讽刺;))。删除ContentPresenter、删除整个模板或使用键。

    第二个问题是 GetContainerForItemOverride 方法。删除此方法将给我的东西在屏幕上!

    这是我的密码:

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

    <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>
    
    推荐文章