web-dev-qa-db-ja.com

wpf:DataGridは選択された行スタイルを無効にする-または行選択

このようなDataGridで選択された行をスタイルする方法に関する多くの例を見ています:

DataGridで選択した行の色を設定する方法

選択した行スタイルを無効にできますか?行の変更を選択したすべてのことをオーバーライドする必要はありません。目に見える変更は必要ありません。テンプレートを作成するよりも簡単な方法が必要です。

または..

行の選択を無効にします(それが簡単な場合)。

WPF DataGridでの選択を無効にする

41
Sonic Soul

選択スタイルを取り除くためにXAMLを見つけました..理想的ではありませんが、十分に近い..

<Style x:Key="CellStyle" TargetType="{x:Type DataGridCell}">
    <Setter Property="Foreground" Value="Black" />
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="{x:Null}" />
            <Setter Property="BorderBrush" Value="{x:Null}" />
        </Trigger>
    </Style.Triggers>
</Style>
72
Sonic Soul

ここに私のために働いたものがあります:

<DataGrid>
    <DataGrid.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Style.Triggers>
                <Trigger Property="DataGridCell.IsSelected" Value="True">
                    <Setter Property="BorderBrush">
                        <Setter.Value>
                            <SolidColorBrush Color="Transparent"/>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Foreground"
                            Value="{DynamicResource
                                   {x:Static SystemColors.ControlTextBrushKey}}"/>
                    <Setter Property="Background">
                        <Setter.Value>
                            <SolidColorBrush Color="Transparent"/>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
    <!-- ... -->
</DataGrid>
21
Dan Stevens

私は自分の状況に合った別の方法を見つけました。ユーザーにセルを選択させたくないので、すべてのセルにこのスタイルを設定します。

<Style TargetType="{x:Type DataGridCell}">
    <Setter Property="IsHitTestVisible" Value="False"/>
</Style>
17
Brian Ensink

最初に2番目の質問に答えます。行の選択を無効にするには、DataGridのRowStyleを変更できます。

<DataGrid>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="IsEnabled" Value="False"/>
        </Style>
    </DataGrid.RowStyle>
    <!--Other DataGrid items-->
</DataGrid>

ただし、行自体が「無効」になっているため、これによりテキストのスタイルが変更されます。また、ユーザーが行を右クリックして選択することもできます。データグリッドの行とのあらゆる種類の対話を本当に無効にしたい場合は、次のことができます。

<DataGrid>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="IsHitTestVisible" Value="False"/>
        </Style>
    </DataGrid.RowStyle>
    <!--Other DataGrid items-->
</DataGrid>

行は引き続き有効であるため、テキストのスタイルは変更されません。

ここで、onlyのみを選択して、選択した行のスタイルを変更し、機能をそのままにしたい場合、次の操作を実行できます(基本的に@Danと同じです)スティーブンスの答え)。 ControlTextBrushKey は、システムがテキストアイテムに色を付けるために使用するブラシです。 DynamicResourceとStaticResourceの間の説明については、 この回答 をご覧ください。

<DataGrid>
    <DataGrid.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Style.Triggers>
                <Trigger Property="DataGridCell.IsSelected" Value="True">
                    <Setter Property="BorderBrush" Value="Transparent"/>
                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                    <Setter Property="Background" Value="Transparent"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
    <!--Other DataGrid items-->
</DataGrid>

上記のソリューションでは、以下に示すように(最初の行が選択されている)行が選択されたときにDataGridRowHeaderのスタイルが変更されないことに注意することが重要です。

enter image description here

8
Joshua

これは比較的簡単です。

datagrid.SelectionChanged += (obj, e) =>
  Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
    datagrid.UnselectAll()));

これにより、DataGridでのすべての選択が無効になります。

選択を完全に無効にするのではなく、非表示にするだけの場合は、テンプレートを変更する必要があります。

6
Ray Burns

スタイルが異なるセルがあり、すべてのスタイルをオーバーライドしたり、各スタイルにトリガーを追加したりしたくない私のような人にとっては、これは良い方法です:

<DataGrid.Resources>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.HighlightBrushKey}" 
        Color="#333333"/>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.HighlightTextBrushKey}" 
        Color="Black"/>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" 
        Color="Black"/>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" 
        Color="Black"/>
</DataGrid.Resources>

HighlightBrushKeyはアクティブな選択範囲を持つ強調表示された境界線であり、HighlightTextBrushKeyはアクティブな選択範囲を持つテキストの色です

私の場合、非アクティブな選択は選択されていないように見えます:

InactiveSelectionHighlightBrushKeyは選択が非アクティブのときの境界線であり、InactiveSelectionHighlightTextBrushKeyは選択が非アクティブのときのテキストです。

参考:SystemColorsは、System.Windows.Media名前空間の一部である静的クラスです。あなたはそれを検査し、好きではない色を恥知らずに上書きすることができます!

1
Benoit Dufresne