如何基于Visual Studio主题设置WPF DataGrid的非活动行颜色

时间:2017-06-28 11:43:29

标签: c# wpf visual-studio-extensions vsix

我正在开发一个VSIX(Visual Studio Extension)项目。它包含一个WPF DataGrid。当DataGrid变为非活动状态(失去焦点)时,我需要设置自定义DataGrid行高亮颜色,基于Visual Studio主题。

虽然通过堆栈溢出找到了许多类似的Q& As,但我无法找到基于Visual studio主题的解决方案。

我遇到了以下一段代码(样式)。但是它不能满足我的要求,请帮助解决这个问题。

 <DataGrid.CellStyle>
            <Style TargetType="{x:Type DataGridCell}">
                <Style.Triggers>
                    <Trigger  Property="IsSelected" Value="true">
                        <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" />
                        <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
                    </Trigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
                            <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=IsKeyboardFocusWithin}" Value="False" />
                        </MultiDataTrigger.Conditions>

                        <MultiDataTrigger.Setters>

                            <!--Following Background color has to be changed based on VS theme-->
                            <Setter Property="Background" Value="DarkGray" />

                            <Setter Property="Foreground" Value="{DynamicResource VsBrush.WindowText}" />

                            <!--This BorderBrush color has to be changed based on VS theme-->
                            <Setter Property="BorderBrush" Value="DarkGray"/>
                        </MultiDataTrigger.Setters>
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.CellStyle>

由于

1 个答案:

答案 0 :(得分:0)

您可以尝试使用VsBrushesEnvironmentColors来实现它。像这样:

<UserControl x:Class="TWToolbar.TestToolWindowControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:vsShell="clr-namespace:Microsoft.VisualStudio.Shell;assembly=Microsoft.VisualStudio.Shell.14.0"
             xmlns:vsUI="clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Shell.14.0"

             mc:Ignorable="d"
             d:DesignHeight="400" d:DesignWidth="500"
             Name="MyToolWindow">
    <Grid>
        <StackPanel Orientation="Vertical">
            <Button Content="Click me!" Click="button1_Click" Width="120" Height="20" Name="button1"/>
            <DataGrid Name="dgUsers" AutoGenerateColumns="False">
            <DataGrid.CellStyle>
                <Style TargetType="{x:Type DataGridCell}">
                    <Style.Triggers>
                        <Trigger  Property="IsSelected" Value="true">
                            <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" />
                            <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
                        </Trigger>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
                                <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=IsKeyboardFocusWithin}" Value="False" />
                            </MultiDataTrigger.Conditions>
                            <MultiDataTrigger.Setters>
                                <!--Following Background color has to be changed based on VS theme WindowText-->
                                <Setter Property="Background" Value="DarkGray" />
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static vsShell:VsBrushes.AccentBorderKey}}"/>
                                <!--<Setter Property="Foreground" Value="{DynamicResource {x:Static vsUI:EnvironmentColors.AccentBorderBrushKey}}"/>-->
                                <!--This BorderBrush color has to be changed based on VS theme-->
                                <Setter Property="BorderBrush" Value="DarkGray"/>
                            </MultiDataTrigger.Setters>
                        </MultiDataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.CellStyle>
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
                    <DataGridTextColumn Header="Birthday" Binding="{Binding Birthday}" />
                </DataGrid.Columns>
            </DataGrid>
        </StackPanel>
    </Grid>
</UserControl>

enter image description here