主题ListView

时间:2015-08-01 13:01:59

标签: wpf themes

根据我的理解,ListView有2种主题样式,一种是在你没有指定View时使用的,另一种是你在使用时使用的。

 <HeaderedContentControl Header="No GridView" Margin="10">
        <ListView>
            <ListView.ItemsSource>
                <x:Array Type="{x:Type sys:String}">
                    <sys:String>A</sys:String>
                    <sys:String>B</sys:String>
                </x:Array>
            </ListView.ItemsSource>
        </ListView>
    </HeaderedContentControl>

    <HeaderedContentControl Header="GridView"
                            Margin="10">
        <ListView>
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Content" />
                </GridView>
            </ListView.View>
            <ListView.ItemsSource>
                <x:Array Type="{x:Type sys:String}">
                    <sys:String>A</sys:String>
                    <sys:String>B</sys:String>
                </x:Array>
            </ListView.ItemsSource>
        </ListView>
    </HeaderedContentControl>

enter image description here

我如何设计这些样式? ..例如,如果我正在制作自定义主题?

我想我会看一下现有主题,所以我从https://msdn.microsoft.com/en-us/library/aa972127(v=VS.90).aspx下载了Luna主题并将其添加为资源。 (我添加了一个按钮,因此你可以看到它确实使用了luna主题)

enter image description here

但是你会注意到除了列标题位之外的Listview是相同的。那么看起来luna主题中的GridView样式甚至没有被使用?我可以进入并更改GridViewItemContainerStyleKey并且它没有任何影响。它似乎总是使用航空风格

作为参考,这里是从Luna主题中获取的GridView样式:

 <Style x:Key="{x:Static GridView.GridViewStyleKey}"
       TargetType="{x:Type ListView}">
    <Setter Property="Background"
            Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
    <Setter Property="BorderBrush"
            Value="{StaticResource ListBorder}"/>
    <Setter Property="BorderThickness"
            Value="1"/>
    <Setter Property="Foreground"
            Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility"
            Value="Auto"/>
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility"
            Value="Auto"/>
    <Setter Property="ScrollViewer.CanContentScroll"
            Value="true"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListView}">
                <Border Name="Bd"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        SnapsToDevicePixels="true">
                    <ScrollViewer Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}"
                                  Padding="{TemplateBinding Padding}">
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </ScrollViewer>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsGrouping"
                             Value="true">
                        <Setter Property="ScrollViewer.CanContentScroll"
                                Value="false"/>
                    </Trigger>
                    <Trigger Property="IsEnabled"
                             Value="false">
                        <Setter TargetName="Bd"
                                Property="Background"
                                Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>


<Style x:Key="{x:Static GridView.GridViewItemContainerStyleKey}"
       TargetType="{x:Type ListViewItem}">
    <Setter Property="Background"
            Value="Transparent"/>
    <Setter Property="VerticalContentAlignment"
            Value="Center"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <Border Name="Bd"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Padding="{TemplateBinding Padding}"
                        SnapsToDevicePixels="true">
                    <GridViewRowPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected"
                             Value="true">
                        <Setter TargetName="Bd"
                                Property="Background"
                                Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                        <Setter Property="Foreground"
                                Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected"
                                       Value="true"/>
                            <Condition Property="Selector.IsSelectionActive"
                                       Value="false"/>
                        </MultiTrigger.Conditions>
                        <Setter TargetName="Bd"
                                Property="Background"
                                Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                        <Setter Property="Foreground"
                                Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                    </MultiTrigger>
                    <Trigger Property="IsEnabled"
                             Value="false">
                        <Setter Property="Foreground"
                                Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

3 个答案:

答案 0 :(得分:0)

使用Expression Blend转出完整的控件模板。 MSDN上的那些并不是真正的。

答案 1 :(得分:0)

标题控件项是GridiewColumnHeader控件。所以你只需像往常一样瞄准它们:

<Window.Resources>
    <Style TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="Background" Value="Red" />
    </Style>
</Window.Resources>

这会将标题变为红色。如果你想要转出真正的&#34;运行时&#34; Blend中的模板......

1)进入XAML

2)将客户端XAML更新为:

<Grid>
  <GridViewColumnHeader />
</Grid>

3)查看|对象&amp;时间表

4)你应该在那里看到你的窗口层次......

Window
 Grid
  GridViewColumnHeader

5)选择GridViewColumnHeader

6)右键单击|编辑模板|编辑副本|行

然后根据需要修改/清理/重构。

答案 2 :(得分:0)

Oooooooooooohhh ......这是一个ListViewItem。 GridView项是列标题。我为此做的是有一个“主”ListViewItem样式并使用指向ListView.View的触发器,如果​​它的x:Null,我假设它是普通视图并将模板设置为我的普通视图模板,否则设置它到我的GridView模板。我有一个主题和非主题版本做同样的事情。所以我实际上有4个模板。