如何使用ListBox作为基类?

时间:2011-07-17 12:18:53

标签: silverlight templates listbox

我使用ListBox来显示一些网格。 我想创建一些将基于(派生自)ListBox的类,并更改此派生类的ItemTemplate

我该怎么做?

我尝试定义一个派生自UserControl类的类 - 并将派生类更改为ListBox类旁边的UserControl - 但这不起作用。

还有其他办法吗?

我需要能够更改ListBoxItem中的ListBox模板,就像我添加到简单的silverlight页面的ListBox一样。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

你可以做的是创建一个模板化控件(你可以通过视觉工作室Add - New Item菜单轻松创建一个),你可以从ListBox派生出来:

public class MyListBox : ListBox
{
    public MyListBox()
    {
        this.DefaultStyleKey = typeof(MyListBox);
    }
}

当您创建模板化控件时,它还将创建文件夹主题,并在其中创建定义样式的generic.xaml。 之后从here获取ListBox - Style并将其复制并粘贴到您的generic.xaml中的正确位置(您还需要ValidationTooltipTemplate):

<Style TargetType="local:MyListBox">
        <Setter Property="Padding" Value="1"/>
        <Setter Property="Background" Value="#FFFFFFFF" />
        <Setter Property="Foreground" Value="#FF000000"/>
        <Setter Property="HorizontalContentAlignment" Value="Left" />
        <Setter Property="VerticalContentAlignment" Value="Top" />
        <Setter Property="IsTabStop" Value="False" />
        <Setter Property="BorderThickness" Value="1" />
        <Setter Property="TabNavigation" Value="Once" />
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="BorderBrush"> ...

好的,之后在相同的xaml中定义ItemTemplate:

<DataTemplate x:Key="MyItemTemplate">

        

并将其添加到ListBox样式的Setter List中:

<Style TargetType="local:MyListBox">
        <Setter Property="ItemTemplate" Value="{StaticResource MyItemTemplate}"/>^

现在它是您的默认模板。

但是,您是否需要向ListBox添加任何特定行为,因为您希望从中继承它。如果您只想添加特定的项目模板,我不建议从ListBox派生(事实上,DataTemplate不是通用的,它总是特定于DataType)。如果你没有添加特定的行为,我会去创建一个全局的DataTemplate(可能在你的app.xaml中定义)并在每次需要时引用它作为DataTemplate,或者我会用这个DataTemplate创建一个特定的样式并将样式设置为常见的ListBox。

如果您有任何疑问,请发表评论。

希望这有帮助!

BR,

TJ

答案 1 :(得分:1)

其他方法,如果您希望控件默认显示为ListBox。只需创建一个派生自ListBox的类,并在默认构造函数中修改默认样式键:

public class MyListBox : ListBox
{
    public MyListBox()
    {
        // the control would look like a listBox by default
        DefaultStyleKey = typeof (ListBox);
    }

    (...)
}