WPF ItemsControl派生自定义控件帮助

时间:2011-05-03 16:58:27

标签: wpf custom-controls itemscontrol


我想编写一个ItemsControl派生的自定义控件。这部分来自需要,部分是作为一个学习练习 - 请不要建议我Style,DataTemplate,ControlTemplate一个ListBox等... I.e.请不要质疑需要 - 只要假设它是真的 我已经在网上找到了很多有用的ItemControl信息但没有明确的例子。 当我在VS中创建新的自定义控件时,我几乎得到了空代码,并且Generic.xaml带有<Style>块,可以通过<Setter Property="Template">等设置ControlTemplates,DataTemplates,Presenters等。但是什么是这里需要最小的xaml /代码来获取一个控件,它将ObservableCollection绑定到ItemsSoruce以显示为列表? 换句话说:什么是ItemsControl派生自定义控件的实用形式?
我需要ItemsPresenter吗?我是否必须在ControlTemplate中指定堆栈面板?我必须在<Setter Property="ItemTemplate">上设置TargetType吗?等
勺子喂养首选,例如说:它很容易,我只需要将DataTemplate集成在项目控制容器的向量空间上,相对于面板主持人yada yada ......这是一个很大的帮助。 更多信息:控件是仅面向显示器,即没有所选项目的概念等。 提前致谢!

默认Generic.xaml(这里添加的最小值是多少?):

<Style TargetType="{x:Type local:MyItemsControlDerivedClass}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyItemsControlDerivedClass}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">        

                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

2 个答案:

答案 0 :(得分:3)

只需查看default styles(按照Default WPF Themes链接):

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>

答案 1 :(得分:0)

添加默认样式为H.B建议工作并使控件可用(项目显示)。删除ItemsPresenter(在ScrollViewer中)会破坏控件(无内容显示)。这篇文章解释了最新进展: http://drwpf.com/blog/2009/05/12/itemscontrol-l-is-for-lookless/
基本上ControlTemplate必须具有:
a)ItemPresenter或
b)IsItemsHost属性设置为true的面板 即,您需要添加到stye的最小值是ControlTemplate,其中包含:
<StackPanel IsItemsHost="True" />
OR
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>