次の方法で共有


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

質問

2013年10月31日木曜日 3:34 | 1 票

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

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

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

すべての返信 (2)

2013年10月31日木曜日 15:45 ✅回答済み | 2 票

.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日火曜日 9:05

回答ありがとうございます。

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