无法获取ItemTemplate的样式显示何时将Style用于ListBox

时间:2012-12-13 02:06:57

标签: wpf listbox itemtemplate

用于样式化ListBox及其项目的简单代码:

    <Style x:Key="SelectorPanelListBoxStyle" TargetType="{x:Type ListBox}">
    <Setter Property="Background" Value="{x:Null}"/>
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="Border.CornerRadius" Value="2"/>
    <Setter Property="ItemTemplate" x:Name="MyItemTemplate">

        <Setter.Value>
            <DataTemplate >
                <Border BorderBrush="White" BorderThickness="1" CornerRadius="5" OverridesDefaultStyle="True">
                    <Grid Height="57" Width="145">

                            <Label Content="{TemplateBinding Content}" />

                            <ContentControl Content="{Binding}" Foreground="White" />

                        </Grid>
                        </Border>

            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

我的每个样式都存储为项目资源部分中的资源库文件,在ResourceLibrary“主文件”中链接为“合并字典”,由App.xaml引用。这显然是有效的,因为我已经有很多这些样式在使用。

我在视图中使用样式类似于以下示例:

 <ListBox Style="{StaticResource SelectorPanelListBoxStyle}" ..../>

不幸的是,BorderBrush,BorderThickness,CornerRadius / etc仅在blend中的痕迹编辑器中显示,并且在实际使用样式时不应用。有时甚至没有。我做错了什么?

提前致谢!

1 个答案:

答案 0 :(得分:1)

我认为您需要使用<ControlTemplate>代替<DataTemplate>。我会把你的上述风格写成:

<Style x:Key="SelectorPanelListBoxStyle" TargetType="{x:Type ListBox}">
<Setter Property="Background" Value="{x:Null}"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="Border.CornerRadius" Value="2"/>
<Setter Property="ItemTemplate" x:Name="MyItemTemplate">
    <Setter.Value>
        <ControlTemplate>
            <Border BorderBrush="White" BorderThickness="1" CornerRadius="5" OverridesDefaultStyle="True">
                <Grid Height="57" Width="145">
                    <Label Content="{TemplateBinding Content}" />
                    <ContentControl Content="{Binding}" Foreground="White" />
                </Grid>
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>
</Style>

我自己的一个ListBox样式如下,以防它可能对您有所帮助:

    <Style TargetType="{x:Type ListBox}">
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="AllowDrop" Value="True"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBox}">
                    <Border BorderThickness="0">
                        <ScrollViewer Margin="0">
                            <StackPanel Margin="0" IsItemsHost="True"/>
                        </ScrollViewer>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <DataTemplate x:Key="GridViewTemplate">
        <Border BorderBrush="LightBlue" BorderThickness="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" CornerRadius="0">
            <Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                <DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                    <TextBlock FontFamily="Segoe UI Light" FontSize="18" Text="{Binding PropFullName}" Margin="2,2,2,2" DockPanel.Dock="Top"/>
                    <TextBlock FontFamily="Segoe UI Light" FontSize="18" Text="{Binding PropTitle}" Margin="2,2,2,2" DockPanel.Dock="Top"/>
                </DockPanel>
            </Grid>
        </Border>
    </DataTemplate>

然后将DataTemplate设置如下:

    <ListBox.ItemTemplate>
         <StaticResource ResourceKey="GridViewTemplate"/>
    </ListBox.ItemTemplate>

编辑1:

        <DataTemplate x:Key="MyListBoxTemplate">
            <Border BorderBrush="White" BorderThickness="1" CornerRadius="5" OverridesDefaultStyle="True">
                <Grid Height="57" Width="145">
                    <Label Content="{TemplateBinding Content}" />
                    <ContentControl Content="{Binding}" Foreground="White" />
                </Grid>
            </Border>
        </DateTemplate>

    <Style TargetType="{x:Type ListBox}">
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="AllowDrop" Value="True"/>
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <StaticResource ResourceKey="MyListBoxItemTemplate"
            </Setter.Value>
        </Setter>
    </Style>