none
DataGridにフォーカスがないときの選択行の色 RRS feed

  • 質問

  • DataGridのフォーカスがあるとき、選択行は青色になりますが、

    DataGridのフォーカスがないとき、選択行はグレーになります。

    DataGridのフォーカスがないときでも選択行を青色にすることはできますでしょうか?

    2013年10月31日 3:34

回答

  • .Net Framework 4.5以降でならリソースのSystem.Windows.SystemColors.InactiveSelectionHighlightBrushKeyを上書きすることで比較的楽にできます。

    <!-- .Net Framework 4.5以降ならこれで出来る -->
    <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="false" Margin="10"  RowHeaderWidth="20">
        <DataGrid.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightSkyBlue"  />
            <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="LightSkyBlue" />
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTextColumn Header="分析結果" Binding="{Binding Path=V1,Mode=OneWay}" Width="100"/>
            <DataGridTextColumn Header="選択" Binding="{Binding Path=V2,Mode=OneWay}" Width="50"/>
        </DataGrid.Columns>
    </DataGrid>

    それ以前ではSystem.Windows.SystemColors.ControlBrushKeyになりますが、同じ手法を使った場合にはWindowsのテーマがクラシックだと残念なことになります。そこで、セルだけに適用されるようにしてみます。

    <!-- .Net Framework 4.5未満なら -->
    <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="false" Margin="10"  RowHeaderWidth="20">
        <DataGrid.Resources>
            <Style  TargetType="{x:Type DataGridCell}" >
                <EventSetter Event="Loaded" Handler="DataGridCell_Loaded" />
            </Style>
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTextColumn Header="分析結果" Binding="{Binding Path=V1,Mode=OneWay}" Width="100"/>
            <DataGridTextColumn Header="選択" Binding="{Binding Path=V2,Mode=OneWay}" Width="50"/>
        </DataGrid.Columns>
    </DataGrid>

    private ResourceKey inactiveSelectionHighlightBrushKey;
    
    private void DataGridCell_Loaded(object sender, RoutedEventArgs e)
    {
        if (inactiveSelectionHighlightBrushKey == null)
        {
            //InactiveSelectionHighlightBrushKeyは4.5以降の環境にしか無いらしいので4.0環境でも動くようにするにはリフレクションでキーを探索する必要が
            var pi = typeof(System.Windows.SystemColors).GetProperty("InactiveSelectionHighlightBrushKey", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
            if (pi != null)
            {
                inactiveSelectionHighlightBrushKey = (ResourceKey)pi.GetValue(null, null);
            }
            else
            {   //4.5未満のテンプレートが使用するキー
                inactiveSelectionHighlightBrushKey = System.Windows.SystemColors.ControlBrushKey;
            }
        }
        DataGridCell dgc = (DataGridCell)sender;
        dgc.Resources[inactiveSelectionHighlightBrushKey] = dgc.FindResource(System.Windows.SystemColors.HighlightBrushKey);
    }
    #テンプレート書き換えでもできるけど

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2013年11月5日 1:36
    • 回答としてマーク yty0918 2013年11月5日 9:03
    2013年10月31日 15:45

すべての返信

  • .Net Framework 4.5以降でならリソースのSystem.Windows.SystemColors.InactiveSelectionHighlightBrushKeyを上書きすることで比較的楽にできます。

    <!-- .Net Framework 4.5以降ならこれで出来る -->
    <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="false" Margin="10"  RowHeaderWidth="20">
        <DataGrid.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightSkyBlue"  />
            <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="LightSkyBlue" />
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTextColumn Header="分析結果" Binding="{Binding Path=V1,Mode=OneWay}" Width="100"/>
            <DataGridTextColumn Header="選択" Binding="{Binding Path=V2,Mode=OneWay}" Width="50"/>
        </DataGrid.Columns>
    </DataGrid>

    それ以前ではSystem.Windows.SystemColors.ControlBrushKeyになりますが、同じ手法を使った場合にはWindowsのテーマがクラシックだと残念なことになります。そこで、セルだけに適用されるようにしてみます。

    <!-- .Net Framework 4.5未満なら -->
    <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="false" Margin="10"  RowHeaderWidth="20">
        <DataGrid.Resources>
            <Style  TargetType="{x:Type DataGridCell}" >
                <EventSetter Event="Loaded" Handler="DataGridCell_Loaded" />
            </Style>
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTextColumn Header="分析結果" Binding="{Binding Path=V1,Mode=OneWay}" Width="100"/>
            <DataGridTextColumn Header="選択" Binding="{Binding Path=V2,Mode=OneWay}" Width="50"/>
        </DataGrid.Columns>
    </DataGrid>

    private ResourceKey inactiveSelectionHighlightBrushKey;
    
    private void DataGridCell_Loaded(object sender, RoutedEventArgs e)
    {
        if (inactiveSelectionHighlightBrushKey == null)
        {
            //InactiveSelectionHighlightBrushKeyは4.5以降の環境にしか無いらしいので4.0環境でも動くようにするにはリフレクションでキーを探索する必要が
            var pi = typeof(System.Windows.SystemColors).GetProperty("InactiveSelectionHighlightBrushKey", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
            if (pi != null)
            {
                inactiveSelectionHighlightBrushKey = (ResourceKey)pi.GetValue(null, null);
            }
            else
            {   //4.5未満のテンプレートが使用するキー
                inactiveSelectionHighlightBrushKey = System.Windows.SystemColors.ControlBrushKey;
            }
        }
        DataGridCell dgc = (DataGridCell)sender;
        dgc.Resources[inactiveSelectionHighlightBrushKey] = dgc.FindResource(System.Windows.SystemColors.HighlightBrushKey);
    }
    #テンプレート書き換えでもできるけど

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2013年11月5日 1:36
    • 回答としてマーク yty0918 2013年11月5日 9:03
    2013年10月31日 15:45
  • 回答ありがとうございます。

    .NET Framework 4で試してみたところ問題なく色を設定できました。

    2013年11月5日 9:05