Цвет наведения переднего плана строки WPF DataGrid - PullRequest
1 голос
/ 17 января 2012

Я уже пару дней бездельничаю со стилем сетки данных, и у меня осталась одна проблема, которую я не могу решить.

Я хочу выделить текст строки, на которойЯ парю с помощью мыши.Ну, это кажется легкой задачей, но в то же время я хочу, чтобы пользовательский цвет выделения фона строки и переднего плана.Мне кажется, что эту комбинацию невозможно решить.

Если я переопределю стиль решетки данных, я получу все, кроме стиля выделения в строке.Если я также переопределю стиль ячейки данных, я могу получить все, кроме выделения строки на переднем плане при наведении курсора мыши.То, что я имею ниже, является полным стилем, который я придумал до сих пор.Я знаю, что он содержит дубликаты атрибутов для тех же задач, но я пробовал все.Отсутствует только выделение при наведении курсора на всю строку - выделена только наведенная ячейка.

Можете ли вы помочь мне решить эту крошечную деталь?

Поместите приведенный ниже код в окно WPF (я знаю окраскуужасно, они только для примера):

<Window.Resources>
    <XmlDataProvider x:Key="persondata"
                     Source="datagrid.xml"
                     XPath="Data" />

    <!-- DataGrid -->
    <Style x:Key="{x:Type DataGrid}"
           TargetType="{x:Type DataGrid}">
        <Setter Property="AlternatingRowBackground"
                Value="Orange" />
        <Setter Property="AlternationCount"
                Value="2" />
        <Setter Property="Background"
                Value="Green" />
        <Setter Property="BorderThickness"
                Value="0" />
        <Setter Property="Foreground"
                Value="Cyan" />
        <Setter Property="HeadersVisibility"
                Value="Column" />
        <Setter Property="RowBackground"
                Value="Yellow" />
    </Style>

    <!-- Column header - remove header background -->
    <Style x:Key="{x:Type DataGridColumnHeadersPresenter}"
           TargetType="{x:Type DataGridColumnHeadersPresenter}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridColumnHeadersPresenter}">
                    <ItemsPresenter />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <!-- Column header sort arrow -->
    <Style x:Key="ColumnHeaderSortArrowStyle"
           TargetType="{x:Type Path}">
        <Setter Property="Data"
                Value="M0,0 L1,0 0.5,1 z" />
        <Setter Property="Fill">
            <Setter.Value>
                <SolidColorBrush Color="Blue" />
            </Setter.Value>
        </Setter>
        <Setter Property="Height"
                Value="6" />
        <Setter Property="Margin"
                Value="0,0,8,0" />
        <Setter Property="RenderTransformOrigin"
                Value="0.5,0.4" />
        <Setter Property="Stretch"
                Value="Fill" />
        <Setter Property="VerticalAlignment"
                Value="Center" />
        <Setter Property="Visibility"
                Value="Collapsed" />
        <Setter Property="Width"
                Value="8" />
    </Style>

    <!-- Column header gripper -->
    <Style x:Key="ColumnHeaderGripperStyle"
           TargetType="{x:Type Thumb}">
        <Setter Property="Width"
                Value="8" />
        <Setter Property="Background"
                Value="Transparent" />
        <Setter Property="Cursor"
                Value="SizeWE" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Thumb}">
                    <Border Background="{TemplateBinding Background}"
                            Padding="{TemplateBinding Padding}" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <!-- Column header -->
    <Style x:Key="{x:Type DataGridColumnHeader}"
           TargetType="{x:Type DataGridColumnHeader}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                    <Border BorderThickness="0,1,1,0"
                            Background="Black"
                            CornerRadius="5,5,0,0">
                        <Border.BorderBrush>
                            <SolidColorBrush Color="Red" />
                        </Border.BorderBrush>

                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>

                            <Thumb x:Name="PART_LeftHeaderGripper"
                                   Grid.Column="0"
                                   Grid.Row="0"
                                   HorizontalAlignment="Left"
                                   Style="{StaticResource ColumnHeaderGripperStyle}" />

                            <ContentPresenter Grid.Column="0"
                                              Grid.Row="0"
                                              Margin="6,3,6,3"
                                              VerticalAlignment="Center" />

                            <Path x:Name="SortArrow"
                                  Grid.Column="1"
                                  Grid.Row="0"
                                  Style="{StaticResource ColumnHeaderSortArrowStyle}">
                            </Path>

                            <Thumb x:Name="PART_RightHeaderGripper"
                                   Grid.Column="1"
                                   Grid.Row="0"
                                   HorizontalAlignment="Right"
                                   Style="{StaticResource ColumnHeaderGripperStyle}" />
                        </Grid>
                    </Border>

                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver"
                                 Value="True">
                            <Setter TargetName="SortArrow"
                                    Property="Fill">
                                <Setter.Value>
                                    <SolidColorBrush Color="Blue" />
                                </Setter.Value>
                            </Setter>
                        </Trigger>

                        <Trigger Property="SortDirection"
                                 Value="Ascending">
                            <Setter TargetName="SortArrow"
                                    Property="Visibility"
                                    Value="Visible" />
                            <Setter TargetName="SortArrow"
                                    Property="RenderTransform">
                                <Setter.Value>
                                    <RotateTransform Angle="180" />
                                </Setter.Value>
                            </Setter>
                        </Trigger>

                        <Trigger Property="SortDirection"
                                 Value="Descending">
                            <Setter TargetName="SortArrow"
                                    Property="Visibility"
                                    Value="Visible" />
                        </Trigger>

                        <Trigger Property="DisplayIndex"
                                 Value="0">
                            <Setter Property="Visibility"
                                    Value="Collapsed"
                                    TargetName="PART_LeftHeaderGripper"></Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver"
                     Value="True">
                <Setter Property="Foreground">
                    <Setter.Value>
                        <SolidColorBrush Color="Blue" />
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>

    <!-- Row -->
    <Style x:Key="{x:Type DataGridRow}"
           TargetType="{x:Type DataGridRow}">
        <Style.Triggers>
            <Trigger Property="ItemsControl.AlternationIndex"
                     Value="0">
                <Setter Property="Background"
                        Value="Yellow" />
                <Setter Property="Foreground">
                    <Setter.Value>
                        <SolidColorBrush Color="Black" />
                    </Setter.Value>
                </Setter>
            </Trigger>
            <Trigger Property="ItemsControl.AlternationIndex"
                     Value="1">
                <Setter Property="Background"
                        Value="Orange" />
                <Setter Property="Foreground">
                    <Setter.Value>
                        <SolidColorBrush Color="Black" />
                    </Setter.Value>
                </Setter>
            </Trigger>
            <Trigger Property="IsMouseOver"
                     Value="true">
                <Setter Property="Foreground">
                    <Setter.Value>
                        <SolidColorBrush Color="Magenta" />
                    </Setter.Value>
                </Setter>
            </Trigger>
            <Trigger Property="IsSelected"
                     Value="True">
                <Setter Property="Background"
                        Value="Brown" />
                <Setter Property="Foreground">
                    <Setter.Value>
                        <SolidColorBrush Color="White" />
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>

    <!-- Cell -->
    <Style x:Key="{x:Type DataGridCell}"
           TargetType="{x:Type DataGridCell}">
        <Setter Property="Foreground">
            <Setter.Value>
                <SolidColorBrush Color="Black" />
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver"
                     Value="true">
                <Setter Property="Foreground">
                    <Setter.Value>
                        <SolidColorBrush Color="Magenta" />
                    </Setter.Value>
                </Setter>
            </Trigger>
            <Trigger Property="IsSelected"
                     Value="True">
                <Setter Property="Background"
                        Value="Brown" />
                <Setter Property="BorderBrush"
                        Value="Brown" />
                <Setter Property="Foreground">
                    <Setter.Value>
                        <SolidColorBrush Color="White" />
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<Grid>
    <DataGrid AutoGenerateColumns="False"
              ItemsSource="{Binding Source={StaticResource persondata}, XPath=Person}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="First Name"
                                Binding="{Binding XPath=@Firstname}" />
            <DataGridTextColumn Header="Last Name"
                                Binding="{Binding XPath=@Lastname}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

Поместите приведенный ниже xml в файл с именем "datagrid.xml" в том же решении:

<?xml version="1.0" encoding="utf-8" ?>
<Data>
    <Person Firstname="Fred"
            Lastname="Flintstone">
    </Person> 
    <Person Firstname="Barney"
            Lastname="Rubble">
    </Person> 
    <Person Firstname="Joe"
            Lastname="Rockhead">
    </Person> 
</Data>

Спасибо...

1 Ответ

0 голосов
/ 18 января 2012

ОК - моя первоначальная проблема заключалась в том, что я использовал базовый стиль, от которого унаследованы все другие стили.Это означало, что такие стили, как Foreground, были переопределены несколько раз в иерархии стилей.Эта запутанная вещь достаточно плохая, чтобы сделать вышеописанное невозможным.

Решение для меня состояло в том, чтобы удалить атрибут BasedOn всех стилей сетки данных, кроме самой DataGrid (datagridrowheader, datagridrow, datagridcell).Установите цвет переднего плана только для DataGrid, и вы можете без проблем переопределить его в стилях строк и ячеек.

/ mfas

...