WPF - изменить стиль выбора для списков в приложении WPF на стиль Windows 7 по умолчанию

В моем приложении WPF возникла проблема со стилем выбора элементов списка. Каждый список i WPF получает темно-синий цвет фона и белый цвет текста.

  1. Почему стиль выбора Windows 7 по умолчанию (например, выбор файла в проводнике Windows) НЕ является стилем выбора по умолчанию в приложении WPF в Windows 7?

  2. Как изменить стиль выделения в WPF на стиль Windows 7 Aero по умолчанию?

Пока что у меня есть это в моем глобальном словаре ресурсов. Но мне все еще нужна граница с закруглением вокруг кисти, чтобы она выглядела одинаково. Есть идеи, как расширить это или любые другие предложения о том, как я могу применить стиль выбора Windows 7 по умолчанию?

<LinearGradientBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" StartPoint="0,0" EndPoint="0,1">
<LinearGradientBrush.GradientStops>
    <GradientStop Offset="0" Color="#FFE3F4FC"/>
    <GradientStop Offset="0.38" Color="#FFD8EFFC"/>
    <GradientStop Offset="0.38" Color="#FFBEE6FD"/>
    <GradientStop Offset="1" Color="#FFA6D9F4"/>
</LinearGradientBrush.GradientStops> </LinearGradientBrush>

<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black"></SolidColorBrush>

person chrisva    schedule 31.03.2011    source источник


Ответы (1)


У меня есть запись в блоге, в которой описывается, как применить внешний вид Windows 7 к ListBox здесь. ListView и TreeView также охвачены, но не полностью соответствуют образу Windows 7.

Соответствующие ресурсы, которые вам необходимо включить:

<!-- Hover Brushes -->
<LinearGradientBrush x:Key="HoverBackgroundBrushKey"
                        StartPoint="0,0"
                        EndPoint="0,1">
    <GradientStop Color="#FCFCFC"
                    Offset="0" />
    <GradientStop Color="#EBF3FD"
                    Offset="1" />
</LinearGradientBrush>
<SolidColorBrush x:Key="HoverOuterBorderBrushKey"
                    Color="#B8D6FB" />
<SolidColorBrush x:Key="HoverInnerBorderBrushKey"
                    Color="#F2F7FE" />

<!-- Selected (Active) Brushes -->
<LinearGradientBrush x:Key="SelectedActiveBackgroundBrushKey"
                        StartPoint="0,0"
                        EndPoint="0,1">
    <GradientStop Color="#DCEBFC"
                    Offset="0" />
    <GradientStop Color="#C1DBFC"
                    Offset="1" />
</LinearGradientBrush>
<SolidColorBrush x:Key="SelectedActiveOuterBorderBrushKey"
                    Color="#7DA2CE" />
<SolidColorBrush x:Key="SelectedActiveInnerBorderBrushKey"
                    Color="#EBF4FD" />

<!-- Selected (Inactive) Brushes -->
<LinearGradientBrush x:Key="SelectedInactiveBackgroundBrushKey"
                        StartPoint="0,0"
                        EndPoint="0,1">
    <GradientStop Color="#F8F8F8"
                    Offset="0" />
    <GradientStop Color="#E5E5E5"
                    Offset="1" />
</LinearGradientBrush>
<SolidColorBrush x:Key="SelectedInactiveOuterBorderBrushKey"
                    Color="#D9D9D9" />
<SolidColorBrush x:Key="SelectedInactiveInnerBorderBrushKey"
                    Color="#F0F0F0" />

<!-- ListBoxItem Style -->
<Style x:Key="{x:Type ListBoxItem}"
        TargetType="{x:Type ListBoxItem}">
    <Setter Property="BorderThickness"
            Value="1" />
    <Setter Property="Padding"
            Value="2,0" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <Grid>
                    <Border x:Name="outerBorder"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            CornerRadius="2"
                            SnapsToDevicePixels="true">
                        <Border x:Name="innerBorder"
                                Background="{TemplateBinding Background}"
                                BorderThickness="1"
                                CornerRadius="1"
                                Padding="{TemplateBinding Padding}"
                                SnapsToDevicePixels="true">
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                        </Border>
                    </Border>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver"
                                Value="true">
                        <Setter TargetName="outerBorder"
                                Property="BorderBrush"
                                Value="{StaticResource HoverOuterBorderBrushKey}" />
                        <Setter TargetName="innerBorder"
                                Property="Background"
                                Value="{StaticResource HoverBackgroundBrushKey}" />
                        <Setter TargetName="innerBorder"
                                Property="BorderBrush"
                                Value="{StaticResource HoverInnerBorderBrushKey}" />
                    </Trigger>
                    <Trigger Property="IsSelected"
                                Value="true">
                        <Setter TargetName="outerBorder"
                                Property="BorderBrush"
                                Value="{StaticResource SelectedActiveOuterBorderBrushKey}" />
                        <Setter TargetName="innerBorder"
                                Property="Background"
                                Value="{StaticResource SelectedActiveBackgroundBrushKey}" />
                        <Setter TargetName="innerBorder"
                                Property="BorderBrush"
                                Value="{StaticResource SelectedActiveInnerBorderBrushKey}" />
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected"
                                        Value="true" />
                            <Condition Property="Selector.IsSelectionActive"
                                        Value="false" />
                        </MultiTrigger.Conditions>
                        <Setter TargetName="outerBorder"
                                Property="BorderBrush"
                                Value="{StaticResource SelectedInactiveOuterBorderBrushKey}" />
                        <Setter TargetName="innerBorder"
                                Property="Background"
                                Value="{StaticResource SelectedInactiveBackgroundBrushKey}" />
                        <Setter TargetName="innerBorder"
                                Property="BorderBrush"
                                Value="{StaticResource SelectedInactiveInnerBorderBrushKey}" />
                    </MultiTrigger>
                    <Trigger Property="IsEnabled"
                                Value="false">
                        <Setter Property="Foreground"
                                Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<!-- ListViewItem Style -->
<Style x:Key="{x:Type ListViewItem}"
        TargetType="{x:Type ListViewItem}"
        BasedOn="{StaticResource {x:Type ListBoxItem}}" />

<!-- Supporting TreeViewItem Resources -->
<PathGeometry x:Key="TreeArrow">
    <PathGeometry.Figures>
        <PathFigureCollection>
            <PathFigure IsFilled="True"
                        StartPoint="0 0"
                        IsClosed="True">
                <PathFigure.Segments>
                    <PathSegmentCollection>
                        <LineSegment Point="0 6" />
                        <LineSegment Point="6 0" />
                    </PathSegmentCollection>
                </PathFigure.Segments>
            </PathFigure>
        </PathFigureCollection>
    </PathGeometry.Figures>
</PathGeometry>
<Style x:Key="ExpandCollapseToggleStyle"
        TargetType="{x:Type ToggleButton}">
    <Setter Property="Focusable"
            Value="False" />
    <Setter Property="Width"
            Value="16" />
    <Setter Property="Height"
            Value="16" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
                <Border Width="16"
                        Height="16"
                        Background="Transparent"
                        Padding="5,5,5,5">
                    <Path x:Name="ExpandPath"
                            Fill="Transparent"
                            Stroke="#FF989898"
                            Data="{StaticResource TreeArrow}">
                        <Path.RenderTransform>
                            <RotateTransform Angle="135"
                                                CenterX="3"
                                                CenterY="3" />
                        </Path.RenderTransform>
                    </Path>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver"
                                Value="True">
                        <Setter TargetName="ExpandPath"
                                Property="Stroke"
                                Value="#FF1BBBFA" />
                        <Setter TargetName="ExpandPath"
                                Property="Fill"
                                Value="Transparent" />
                    </Trigger>

                    <Trigger Property="IsChecked"
                                Value="True">
                        <Setter TargetName="ExpandPath"
                                Property="RenderTransform">
                            <Setter.Value>
                                <RotateTransform Angle="180"
                                                    CenterX="3"
                                                    CenterY="3" />
                            </Setter.Value>
                        </Setter>
                        <Setter TargetName="ExpandPath"
                                Property="Fill"
                                Value="#FF595959" />
                        <Setter TargetName="ExpandPath"
                                Property="Stroke"
                                Value="#FF262626" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<!-- TreeViewItem Style -->
<Style x:Key="{x:Type TreeViewItem}"
        TargetType="{x:Type TreeViewItem}">
    <Setter Property="BorderThickness"
            Value="1" />
    <Setter Property="Padding"
            Value="2,0" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TreeViewItem}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition MinWidth="19"
                                            Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <ToggleButton x:Name="expander"
                                    Style="{StaticResource ExpandCollapseToggleStyle}"
                                    IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
                                    ClickMode="Press" />
                    <Border x:Name="outerBorder"
                            Grid.Column="1"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            CornerRadius="2"
                            SnapsToDevicePixels="true">
                        <Border x:Name="innerBorder"
                                Background="{TemplateBinding Background}"
                                BorderThickness="1"
                                CornerRadius="1"
                                Padding="{TemplateBinding Padding}"
                                SnapsToDevicePixels="true">
                            <ContentPresenter x:Name="PART_Header"
                                                ContentSource="Header"
                                                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                        </Border>
                    </Border>
                    <ItemsPresenter x:Name="itemsHost"
                                    Grid.Row="1"
                                    Grid.Column="1"
                                    Grid.ColumnSpan="2" />
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsExpanded"
                                Value="false">
                        <Setter TargetName="itemsHost"
                                Property="Visibility"
                                Value="Collapsed" />
                    </Trigger>
                    <Trigger Property="HasItems"
                                Value="false">
                        <Setter TargetName="expander"
                                Property="Visibility"
                                Value="Hidden" />
                    </Trigger>
                    <Trigger SourceName="outerBorder"
                                Property="IsMouseOver"
                                Value="true">
                        <Setter TargetName="outerBorder"
                                Property="BorderBrush"
                                Value="{StaticResource HoverOuterBorderBrushKey}" />
                        <Setter TargetName="innerBorder"
                                Property="Background"
                                Value="{StaticResource HoverBackgroundBrushKey}" />
                        <Setter TargetName="innerBorder"
                                Property="BorderBrush"
                                Value="{StaticResource HoverInnerBorderBrushKey}" />
                    </Trigger>
                    <Trigger Property="IsSelected"
                                Value="true">
                        <Setter TargetName="outerBorder"
                                Property="BorderBrush"
                                Value="{StaticResource SelectedActiveOuterBorderBrushKey}" />
                        <Setter TargetName="innerBorder"
                                Property="Background"
                                Value="{StaticResource SelectedActiveBackgroundBrushKey}" />
                        <Setter TargetName="innerBorder"
                                Property="BorderBrush"
                                Value="{StaticResource SelectedActiveInnerBorderBrushKey}" />
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected"
                                        Value="true" />
                            <Condition Property="Selector.IsSelectionActive"
                                        Value="false" />
                        </MultiTrigger.Conditions>
                        <Setter TargetName="outerBorder"
                                Property="BorderBrush"
                                Value="{StaticResource SelectedInactiveOuterBorderBrushKey}" />
                        <Setter TargetName="innerBorder"
                                Property="Background"
                                Value="{StaticResource SelectedInactiveBackgroundBrushKey}" />
                        <Setter TargetName="innerBorder"
                                Property="BorderBrush"
                                Value="{StaticResource SelectedInactiveInnerBorderBrushKey}" />
                    </MultiTrigger>
                    <Trigger Property="IsEnabled"
                                Value="false">
                        <Setter Property="Foreground"
                                Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
person CodeNaked    schedule 01.04.2011
comment
Глядя на ваш код, кажется, что это сработает. Однако я немного разочарован в Microsoft тем, что они не поддержали стиль ОС по умолчанию для выбора в структуре представления для WPF. Означает ли это, что мне нужно создать / переопределить шаблоны для всех контроллеров со стилем выбора, таким как DataGrid, TreeView и т. Д.? - person chrisva; 04.04.2011
comment
@chrisva - Верно, вам нужно будет оформить эти элементы управления, если вы хотите, чтобы у Windows 7 был согласованный вид. - person CodeNaked; 04.04.2011
comment
Я думаю, что нет способа подключить активную тему операционной системы или тему по умолчанию для WPF. Дело в том, что один и тот же элемент управления может содержать N элементов управления. поэтому предоставление темы для индивидуального управления не имеет смысла. - person Mohanavel; 02.11.2011
comment
Хорошо сделано. Мне очень помогло, хотя я переопределил цвета для желтой / синей темы, как в меню Visual Studio. - person KroaX; 23.12.2011