WPF ItemsControl派生的自定义控件帮助

WPF ItemsControl派生的自定义控件帮助,wpf,custom-controls,itemscontrol,Wpf,Custom Controls,Itemscontrol,我想写一个ItemsControl派生的自定义控件。这部分是出于需要,部分是作为一个学习练习-请不要建议我的风格,数据模板,控制模板列表框等。。。也就是说,请不要质疑需求——只要假设它是真实的。 我在网上搜索了很多有用的ItemControl信息,但没有明确的例子。 当我在VS中创建新的自定义控件时,我得到了一个几乎为空的code behind和Generic.xaml,其中包含一个块,可以设置ControlTemplates、DataTemplates、,演示者通过等进行演示。但是,要获得将绑


我想写一个ItemsControl派生的自定义控件。这部分是出于需要,部分是作为一个学习练习-请不要建议我的风格,数据模板,控制模板列表框等。。。也就是说,请不要质疑需求——只要假设它是真实的。
我在网上搜索了很多有用的ItemControl信息,但没有明确的例子。 当我在VS中创建新的自定义控件时,我得到了一个几乎为空的code behind和Generic.xaml,其中包含一个
块,可以设置ControlTemplates、DataTemplates、,演示者通过
等进行演示。但是,要获得将绑定到ObservableCollection以ItemsProce显示为列表的控件,这里需要的最小xaml/代码是多少换句话说:ItemsControl派生的自定义控件的单独形式是什么?
我需要一个ItemsPresenter吗?我必须在ControlTemplate中指定堆栈窗格吗?我必须在
上设置TargetType吗?等等
汤匙喂食更喜欢这样说:这很容易,我只需要在物品控制容器的向量空间上集成数据模板,与面板演示者yada yada。。。这不是一个很大的帮助。 进一步信息:该控件仅面向显示,即没有所选项目的概念等。 提前谢谢

Default Generic.xaml(此处至少要添加什么?)


只需查看(遵循
默认WPF主题链接):

e、 g.列表框:

<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>

根据H.B的建议添加默认样式会起作用并使控件可用(显示项)。移除ItemsPresenter(在ScrollViewer中)会断开控件(无内容显示)。这篇文章解释了发生了什么:
从本质上讲,ControlTemplate必须具有以下任一项:
a) 项目演示者或
b) IsItemsHost属性设置为true的面板。
也就是说,您需要添加到stye中的最小值是一个ControlTemplate,其中包含:



谢谢HB-添加代码并删除部分代码直到失败,这对我帮助很大,让我找到了关键部分(见我自己的答案)。
<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>