ฉันจะกำหนดสีของแถวที่เลือกใน DataGrid ได้อย่างไร


127

สีพื้นหลังเริ่มต้นของแถวที่เลือกใน DataGrid มืดมากจนอ่านไม่ออก มีการลบล้างมันหรือไม่?

พยายามแล้ว

<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>

แต่ยังไม่มีอะไร ...


เมื่อคุณพูดว่า 'พยายามแล้ว' คุณหมายความว่าคุณลองแล้ว แต่มันไม่ได้ผล?
พันเอก Panic

2
ใช่แล้วมันหมายถึงอะไร @ColonelPanic
co2f2e

คำตอบ:


157

วิธีแก้ปัญหาข้างต้นทำให้เหลือเส้นขอบสีน้ำเงินรอบ ๆ แต่ละเซลล์ในกรณีของฉัน

นี่คือวิธีแก้ปัญหาที่ได้ผลสำหรับฉัน มันง่ายมากเพียงแค่เพิ่มสิ่งนี้ลงในDataGridไฟล์. คุณสามารถเปลี่ยนจากSolidColorBrushแปรงเป็นแปรงอื่น ๆ เช่นการไล่ระดับสีเชิงเส้น

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

สมบูรณ์แบบ - สิ่งที่ฉันต้องการ อนุญาตให้ฉันอ้างอิงสไตล์ที่มีอยู่สำหรับ DG ต่อไปและเปลี่ยนแปรงพื้นหลังสำหรับแถวที่เลือก
Gatmando

5
wounderfull มีความคิดอย่างไรกับการทำสีพื้นหน้า?
Arsen Zahray

8
Arsen เพียงแค่แทนที่แปรงสำหรับ SystemColors.HighlightTextBrushKey ในลักษณะเดียวกับการตั้งค่าสีข้อความ
Ben McIntosh

ถ้าฉันเลือกทั้งแถวผ่าน Databinding เช่น<DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"แถวนั้นเป็น LightGrey เท่านั้น มี SystemColors ด้วยหรือไม่? '
Rolfi

6
SystemColors.ControlBrushKeyในที่สุดก็พบว่าหนึ่งถ้ามันไม่ได้มีโฟกัส:
Rolfi

100

เข้าใจแล้ว เพิ่มสิ่งต่อไปนี้ภายในส่วน DataGrid.Resources:

  <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>

มันเยี่ยมมากฉันเพิ่งเจอสิ่งนี้และฉันก็รู้สึกหงุดหงิด :-)
Rob

6
คุณใส่ไว้ในส่วนใด
พันเอก Panic

7
เนื่องจากBorderBrushสีฟ้ายังคงอยู่หากสร้างความรำคาญให้ใครบางคนให้เพิ่มSetterองค์ประกอบอื่นซึ่งตั้งค่าBorderBrushคุณสมบัติการอ้างอิงเป็นสี (ค่า) เดียวกับBackgroundตัวมันเอง
ไก่

75

ในฐานะที่เป็นส่วนขยายของคำตอบของ @Seb Kade คุณสามารถควบคุมสีของแถวที่เลือกและไม่ได้เลือกโดยใช้สิ่งต่อไปนี้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>

คุณสามารถป้อนสีใดก็ได้ที่คุณต้องการ สิ่งนี้Styleจะใช้ได้กับรายการคอลเลกชันอื่น ๆ เช่นListBoxItems (ถ้าคุณแทนที่TargetType="{x:Type DataGridRow}"ด้วยTargetType="{x:Type ListBoxItem}"เช่น)


6
ทางออกของคุณดีที่สุด
พัฒนา

ดี Sheridan ฉันต้องการสีพื้นหน้าของแถวในแถวที่เลือกด้วย แต่ใช้ HighlightTextBrushKey เริ่มต้น (เช่นสีดำ) จะทำยังไง?
deathrace

1
@ deathrace.dj ถ้าฉันเข้าใจคุณถูกต้องคุณก็ต้องเปลี่ยนColorคุณสมบัติของสิ่งที่สามSolidColorbrushในตัวอย่างของฉันเป็นสีใดก็ได้ที่คุณต้องการ การใช้คำประกาศนี้เป็นการกำหนดสีของSolidColorbrushการSystemColors.HighlightTextBrushKeyใช้งาน โปรดระวังว่าคุณไม่ได้ตั้งค่าForegroundสีไว้Styleที่อื่นเพราะอาจลบล้างการตั้งค่าในResourcesด้านบนได้
Sheridan

ขอบคุณนี่คือสิ่งที่ฉันกำลังมองหา!
Enrico

คุณอาจต้องการตั้งแปรงโปร่งใสSystemColors.InactiveSelectionHighlightBrushKeyหรือแถวจะไฮไลต์เมื่อกริดสูญเสียโฟกัส
dlf

19

ฉันมีปัญหานี้และเกือบจะฉีกผมออกและฉันไม่สามารถหาคำตอบที่เหมาะสมได้จากอินเทอร์เน็ต ฉันพยายามควบคุมสีพื้นหลังของแถวที่เลือกใน WPF DataGrid มันจะไม่ทำ ในกรณีของฉันเหตุผลก็คือฉันมี CellStyle ในดาต้ากริดของฉันด้วยและ CellStyle ลบล้าง RowStyle ที่ฉันตั้งค่าไว้ น่าสนใจเพราะ CellStyle ไม่ได้ตั้งค่าสีพื้นหลังด้วยซ้ำซึ่งถูกกำหนดโดยคุณสมบัติ RowBackground และ AlternateRowBackground อย่างไรก็ตามการพยายามตั้งค่าสีพื้นหลังของแถวที่เลือกไม่ได้ผลเลยเมื่อฉันทำสิ่งนี้:

        <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>

และมันได้ผลเมื่อฉันย้ายสไตล์ที่ต้องการสำหรับแถวที่เลือกออกจากสไตล์แถวและเข้าไปในสไตล์เซลล์ดังนี้:

    <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>

เพียงโพสต์สิ่งนี้เผื่อว่ามีคนประสบปัญหาเดียวกัน


สิ่งนี้เกิดขึ้นทุกครั้งเซลล์จะกำหนดพื้นหน้าและทุกตัวกำหนดเป้าหมายไปที่แถว
eran otzap

1
ฉันเจอเรื่องนี้เช่นกันและฉันไม่ได้ตั้งค่า CellStyle ด้วยซ้ำ เมื่อฉันพยายามตั้งค่านี้ในรูปแบบแถวจะมีผลกับองค์ประกอบที่ไม่ใช่เซลล์เท่านั้น
BigSandwich

12

ทริกเกอร์ IsSelected เริ่มต้นจะเปลี่ยนคุณสมบัติ 3 อย่างคือ Background, Foreground & BorderBrush หากคุณต้องการเปลี่ยนเส้นขอบและพื้นหลังให้ใส่สิ่งนี้ไว้ในทริกเกอร์สไตล์ของคุณ

<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 แทนที่จะทำการเปลี่ยนแปลงที่สำคัญกับคำตอบนี้ในช่วงท้ายเกมคุณควรเพิ่มคำตอบของคุณเอง
Michael Petrotta

9

สาเหตุบางประการที่ฉันพบว่าเหตุการณ์ที่เลือกแถวไม่ทำงาน

  1. สไตล์ถูกตั้งค่าสำหรับ DataGridCell
  2. ใช้คอลัมน์ Templated
  3. ทริกเกอร์ถูกตั้งค่าที่ DataGridRow

นี่คือสิ่งที่ช่วยฉัน การตั้งค่ารูปแบบสำหรับ DataGridCell

<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>

และเนื่องจากฉันใช้คอลัมน์เทมเพลตที่มีป้ายกำกับอยู่ข้างในฉันจึงผูกคุณสมบัติ Foreground กับคอนเทนเนอร์ Foreground โดยใช้การเชื่อม RelativeSource:

<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 แล้ว แต่ไม่ได้ผลกับแถวที่ไม่ได้เลือก พื้นหลังของแถวที่ไม่ได้เลือกยังคงเป็นสีขาว แต่ฉันพบว่าฉันต้องลบล้างสไตล์แถว

<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

ฉันใช้เวลาส่วนที่ดีกว่าของวันในการเล่นซอกับปัญหานี้ เปิดคุณสมบัติ RowBackground บน DataGrid - ที่ฉันตั้งไว้ - กำลังลบล้างความพยายามทั้งหมดในการเปลี่ยนแปลง ทันทีที่ฉันลบมันทุกอย่างก็ใช้ได้ (เช่นเดียวกันกับ Foreground ที่ตั้งไว้ใน DataGridTextColumn โดยวิธีนี้)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.