DataGrid'de seçilen bir satırın rengini nasıl ayarlayabilirim


127

DataGrid'de seçilen bir satırın varsayılan arka plan rengi o kadar koyu ki okuyamıyorum. Bunu geçersiz kılmanın bir yolu var mı?

Bunu denedim

<dg:DataGrid.RowStyle>
    <Style TargetType="{x:Type dg:DataGridRow}">
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True" >
                <Setter Property="Background" Value="Gainsboro" />
            </Trigger>
        </Style.Triggers>
    </Style>
</dg:DataGrid.RowStyle>

Ama yine de hiçbir şey ...


'Bunu denedim' derken, denediğini ve işe yaramadığını mı söylüyorsun?
Albay Panic

2
Evet, anlamı bu @ColonelPanic
co2f2e

Yanıtlar:


157

Yukarıdaki çözüm, benim durumumda her hücrenin etrafında mavi sınır bıraktı.

Benim için işe yarayan çözüm bu. Çok basit, sadece bunu ekleyin DataGrid. Bunu, SolidColorBrushdoğrusal gradyan gibi başka bir fırçadan değiştirebilirsiniz .

<DataGrid.Resources>
  <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
                   Color="#FF0000"/>
</DataGrid.Resources>

Mükemmel - tam da ihtiyacım olan şey. DG için mevcut bir stile başvurmaya devam etmeme ve seçilen satırın arka plan fırçasını değiştirmeme izin verdi.
Gatmando

5
wounderfull. Aynısını ön plan rengine nasıl yapacağınıza dair bir fikriniz var mı?
Arsen Zahray

8
Arsen, metin rengini ayarlamak için aynı şekilde SystemColors.HighlightTextBrushKey için fırçayı geçersiz kıl.
Ben McIntosh

<DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"Veri bağlama yoluyla tüm satırı seçersem, örneğin satır yalnızca LightGrey'dir. SystemColors da var mı? ´
Rolfi

6
O Odak yoksa Nihayet bir tane buldum: SystemColors.ControlBrushKey.
Rolfi

100

Anladım. DataGrid.Resources bölümüne aşağıdakileri ekleyin:

  <DataGrid.Resources>
     <Style TargetType="{x:Type dg:DataGridCell}">
        <Style.Triggers>
            <Trigger Property="dg:DataGridCell.IsSelected" Value="True">
                <Setter Property="Background" Value="#CCDAFF" />
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.Resources>

Bu harika, bununla karşılaştım ve hayal kırıklığına uğradım :-)
Rob

6
Bunu hangi bölüme koyuyorsunuz?
Albay Panic

7
Yana BorderBrushmavi kalır Birini sıkıyor, eğer sadece başka eklemek Settersetleri elemanı, BorderBrushaynı renkte (değer) için bağımlılık özelliği Backgroundkendisi.
kai

75

@Seb Kade'nin cevabının bir uzantısı olarak, aşağıdakileri kullanarak seçilen ve seçilmemiş satırların renklerini tam olarak kontrol edebilirsiniz Style:

<Style TargetType="{x:Type DataGridRow}">
    <Style.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" />
    </Style.Resources>
</Style>

Elbette tercih ettiğiniz renkleri girebilirsiniz. Bu Styleaynı zamanda ListBoxItems gibi diğer koleksiyon öğeleri için de işe yarar ( örneğin TargetType="{x:Type DataGridRow}"ile değiştirirseniz TargetType="{x:Type ListBoxItem}").


6
Sizin çözümünüz en iyisidir.
Geliştirici

Güzel, Sheridan. Ayrıca satırımın ön plan rengini seçili satırda istiyorum. ancak varsayılan HighlightTextBrushKey (yani siyah) alır. ne yapalım?
deathrace

1
@ deathrace.dj, Sizi doğru anladıysam, o zaman örneğimdeki Colorüçüncünün özelliğini SolidColorbrushistediğiniz renkle değiştirmeniz yeterlidir . Bu deklarasyon kullanmak aslında rengini ayarlıyor SolidColorbrusholduğu SystemColors.HighlightTextBrushKeykullanımlar. ForegroundRengi başka bir Styleyerde ayarlamamış olsanız da , bu Resourcesyukarıdaki ayarları geçersiz kılabilir .
Sheridan

Teşekkürler, tam olarak aradığım buydu!
Enrico

Ayrıca için şeffaf bir fırça ayarlamak isteyebilirsiniz SystemColors.InactiveSelectionHighlightBrushKeyveya ızgara odağı kaybettiğinde satır vurgulanır
dlf

19

Bu sorunu yaşadım ve neredeyse saçımı yırtıyordum ve internette uygun cevabı bulamadım. Bir WPF DataGrid'de seçilen satırın arka plan rengini kontrol etmeye çalışıyordum. Sadece yapmazdı. Benim durumumda bunun nedeni, datagrid'imde bir CellStyle'ım olması ve CellStyle'ın ayarladığım RowStyle'ı geçersiz kılmasıydı. İlginç bir şekilde, CellStyle arka plan rengini bile ayarlamıyordu, bunun yerine RowBackground ve AlternateRowBackground özellikleri tarafından ayarlanan bing idi. Yine de, bunu yaptığımda seçilen satırın arka plan rengini ayarlamaya çalışmak hiç işe yaramadı:

        <DataGrid ... >
        <DataGrid.RowBackground>
            ...
        </DataGrid.RowBackground>
        <DataGrid.AlternatingRowBackground>
            ...
        </DataGrid.AlternatingRowBackground>
        <DataGrid.RowStyle>
            <Style TargetType="{x:Type DataGridRow}">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="Pink"/>
                        <Setter Property="Foreground" Value="White"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>
        <DataGrid.CellStyle>
            <Style TargetType="{x:Type DataGridCell}">
                <Setter Property="Foreground" Value="{Binding MyProperty}" />
            </Style>
        </DataGrid.CellStyle>

ve seçilen satır için istenen stili satır stilinin dışına ve hücre stiline taşıdığımda işe yaradı, şöyle:

    <DataGrid ... >
        <DataGrid.RowBackground>
            ...
        </DataGrid.RowBackground>
        <DataGrid.AlternatingRowBackground>
            ...
        </DataGrid.AlternatingRowBackground>
        <DataGrid.CellStyle>
            <Style TargetType="{x:Type DataGridCell}">
                <Setter Property="Foreground" Value="{Binding MyProperty}" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="Pink"/>
                        <Setter Property="Foreground" Value="White"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.CellStyle>

Birinin aynı sorunu yaşama ihtimaline karşı bunu gönderiyorum.


Bu her seferinde olur, hücre bir ön plan belirler ve her vücut sırayı hedef alır.
eran otzap

1
Buna ben de rastladım ve bir CellStyle bile ayarlamıyorum. Bunu satır stilinde ayarlamaya çalıştığımda, yalnızca hücre dışı öğeleri etkiledi.
BigSandwich

12

Varsayılan IsSelected tetikleyicisi 3 özelliği değiştirir: Arka Plan, Ön Plan ve Kenar Fırçası. Arka planı olduğu kadar kenarlığı da değiştirmek istiyorsanız, bunu stil tetikleyicinize eklemeniz yeterlidir.

<Style TargetType="{x:Type dg:DataGridCell}">
    <Style.Triggers>
        <Trigger Property="dg:DataGridCell.IsSelected" Value="True">
            <Setter Property="Background" Value="#CCDAFF" />
            <Setter Property="BorderBrush" Value="Black" />
        </Trigger>
    </Style.Triggers>
</Style>

@Mark H, oyunun bu geç saatlerinde bu cevapta büyük değişiklikler yapmak yerine, kendi cevabınızı eklemelisiniz.
Michael Petrotta

9

Seçilen satırın çalışmamasına neden olan nedenlerden bazıları

  1. DataGridCell için stil ayarlandı
  2. Şablonlu sütunları kullanma
  3. Tetikleyici DataGridRow'da ayarlanır

Bana yardımcı olan buydu. DataGridCell için Stili Ayarlama

<Style TargetType="{x:Type DataGridCell}">
  <Style.Triggers>
    <Trigger Property="IsSelected" Value="True">
      <Setter Property="Background" Value="Green"/>
      <Setter Property="Foreground" Value="White"/>
    </Trigger>
  </Style.Triggers> 
</Style>

Ve içinde etiket bulunan bir şablon sütunu kullandığım için, Foreground özelliğini RelativeSource bağlama kullanarak Foreground konteynerine bağladım:

<DataGridTemplateColumn>
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <Label Content="{Binding CategoryName,
                 Mode=TwoWay,
                 UpdateSourceTrigger=LostFocus}"
             Foreground="{Binding Foreground,
                 RelativeSource={RelativeSource Mode=FindAncestor,
                     AncestorLevel=1, 
                     AncestorType={x:Type DataGridCell}}}"
             Width="150"/>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

4

ControlBrushKey'i denedim, ancak seçilmemiş satırlar için çalışmadı. Seçilmemiş satırın arka planı hala beyazdı. Ancak, sıra tarzını geçersiz kılmam gerektiğini bulmayı başardım.

<DataGrid x:Name="pbSelectionDataGrid" Height="201" Margin="10,0"
          FontSize="20" SelectionMode="Single" FontWeight="Bold">
    <DataGrid.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FFFDD47C"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#FFA6E09C"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Red"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Violet"/>
    </DataGrid.Resources>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="Background" Value="LightBlue" />
        </Style>
    </DataGrid.RowStyle>
</DataGrid>

2

Bir günün büyük bir kısmını bu problemle uğraşarak geçirdim. DataGrid üzerindeki RowBackground Özelliğinin - benim ayarladığım - onu değiştirmek için tüm girişimleri geçersiz kıldığı ortaya çıktı. Onu sildiğim anda her şey çalıştı. (Bu arada, DataGridTextColumn'da ayarlanmış Ön plan için de aynı şey geçerli).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.