मैं 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>

लेकिन फिर भी कुछ नहीं ...


जब आप कहते हैं 'इस कोशिश की' आप मतलब है कि तुम कोशिश की और यह काम नहीं किया?
कर्नल पैनिक

2
हां, इसका क्या मतलब है @ColonelPanic
co2f2e

जवाबों:


156

उपरोक्त समाधान ने मेरे मामले में प्रत्येक सेल के चारों ओर नीली सीमा छोड़ दी।

यह वह उपाय है जो मेरे लिए काम करता है। यह बहुत सरल है, बस इसे अपने में जोड़ें DataGrid। आप इसे एक SolidColorBrushसे दूसरे ब्रश जैसे कि लीनियर ग्रेडिएंट में बदल सकते हैं ।

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

बिल्कुल सही - जो मुझे चाहिए था। मुझे डीजी के लिए एक मौजूदा शैली का संदर्भ देना जारी रखने और चयनित पंक्ति के लिए पृष्ठभूमि ब्रश बदलने की अनुमति दी।
गैटमांडो

5
wounderfull। कैसे अग्रभूमि रंग के लिए एक ही करने के लिए पर कोई विचार?
आर्सेन ज़ाहरे

8
आर्सेन, बस टेक्स्ट कलर सेट करने के लिए SystemColors.HighlightTextBrushKey के ब्रश को ओवरराइड करें।
बेन मैकिन्टोश

अगर मैं डेटाबाइंडिंग के माध्यम से पूरी पंक्ति का चयन करता हूँ, तो <DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"पंक्ति केवल लाइटग्री है। क्या कोई SystemColors भी है? '
Rolfi

6
अंत में एक पाया अगर यह फोकस नहीं है SystemColors.ControlBrushKey:।
रॉल्फ़ि

100

समझ गया। DataGrid.Resource सेक्शन के भीतर निम्नलिखित जोड़ें:

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

यह बहुत अच्छा है, मैं बस इस में भाग गया और मैं निराश हो रहा था :-)
रोब

6
आप किस धारा में डालते हैं?
कर्नल पैनिक

7
चूंकि BorderBrushनीला रहता है, अगर यह किसी को परेशान करता है, तो बस एक और Setterतत्व जोड़ें , जो BorderBrushनिर्भरता गुण को उसी रंग (मान) के रूप में सेट Backgroundकरता है।
काई

75

@ केब काडे के जवाब के लिए एक उद्धरण के रूप में, आप निम्नलिखित का उपयोग करके चयनित और अचयनित पंक्तियों के रंगों को पूरी तरह से नियंत्रित कर सकते हैं 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भी इस तरह के रूप में अन्य संग्रह मदों के लिए काम करेंगे ListBoxItem(यदि आप की जगह रों TargetType="{x:Type DataGridRow}"साथ TargetType="{x:Type ListBoxItem}"उदाहरण के लिए)।


6
आपका समाधान सबसे अच्छा है।
डेवलपर

अच्छा लगा, शेरिदान। मैं अपनी पंक्ति के अग्रभूमि का रंग चयनित पंक्ति पर भी चाहता हूं। लेकिन यह डिफ़ॉल्ट हाइलाइटटैक्सब्रशके (यानी काला) लेता है। क्या करें?
मृत्यु

1
@ deathrace.dj, अगर मैं आपको सही तरीके से समझता हूं, तो आपको मेरे रंग की तरह जो भी हो, आपको मेरे उदाहरण में Colorतीसरे की संपत्ति को बदलने की आवश्यकता है SolidColorbrush। इस घोषणा का उपयोग वास्तव में के रंग सेट कर रहा है SolidColorbrushकि SystemColors.HighlightTextBrushKeyका उपयोग करता है। हालांकि सावधान रहें कि आपने कहीं Foregroundऔर रंग सेट नहीं किया Styleहै क्योंकि यह Resourcesऊपर की सेटिंग्स को ओवरराइड कर सकता है।
शेरिडन

धन्यवाद, यह वही है जो मैं देख रहा था!
एनरिको

तुम भी एक पारदर्शी ब्रश सेट करना चाहते हो सकता है SystemColors.InactiveSelectionHighlightBrushKey, या जब ग्रिड ध्यान खो देता है तो पंक्ति हाइलाइट होगी
dbl

19

मुझे यह समस्या थी और मैंने अपने बालों को लगभग उखाड़ दिया था, और मैं नेट पर उचित उत्तर नहीं पा रहा था। मैं WPF DataGrid में चयनित पंक्ति की पृष्ठभूमि का रंग नियंत्रित करने का प्रयास कर रहा था। यह सिर्फ यह नहीं होगा। मेरे मामले में, इसका कारण यह था कि मेरे डेटाग्रिड में सेल सेल्टील भी था, और सेलसटाइल ने मेरे द्वारा स्थापित रोसेल्टी को ओवररोड किया। दिलचस्प बात यह है कि, क्योंकि सेलसिटी बैकग्राउंड कलर भी सेट नहीं कर रहा था, जिसके बजाय रोवैकग्राउंड और अल्टरनेट रीवबैक ग्राउंड गुणों द्वारा सेट किया गया था। फिर भी, जब मैंने ऐसा किया तो चयनित पंक्ति की पृष्ठभूमि का रंग सेट करने की कोशिश नहीं की गई:

        <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
मैं इस में भी भाग गया, और मैं एक सेलसिले भी सेट नहीं कर रहा हूँ। जब मैंने इसे पंक्ति शैली पर सेट करने का प्रयास किया, तो इसने केवल गैर-सेल तत्वों को प्रभावित किया।
BigSandwich

12

डिफ़ॉल्ट IsSelected ट्रिगर में 3 गुण, पृष्ठभूमि, फ़ोरग्राउंड और बॉर्डरब्रश परिवर्तित होते हैं। अगर आप बॉर्डर के साथ-साथ बैकग्राउंड भी बदलना चाहते हैं, तो इसे अपनी स्टाइल ट्रिगर में शामिल करें।

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

@ मर्क एच, इस उत्तर में खेल में देर से बड़े बदलाव करने के बजाय, आपको अपना जवाब जोड़ना चाहिए।
माइकल पेट्रोत्ता

9

कुछ कारणों से जो मैंने अनुभव किया कि पंक्ति चयनित घटना काम नहीं कर रही है

  1. शैली DataGridCell के लिए सेट की गई है
  2. टेंपलेटेड कॉलम का उपयोग करना
  3. ट्रिगर डेटाग्रिडो में स्थापित किया गया है

इससे मुझे मदद मिली। 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>

और जब से मैं अंदर एक लेबल के साथ एक टेम्पलेट कॉलम का उपयोग कर रहा था, मैंने कंटेनर फ़ोरग्राउंड के लिए फ़ोरग्राउंड प्रॉपर्टी को 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

मैंने इस समस्या से जूझते हुए एक दिन का बेहतर हिस्सा बिताया। डेटाग्रिड पर रो-बैकग्राउंड प्रॉपर्टी - जिसे मैंने सेट किया था - इसे बदलने के सभी प्रयासों को पछाड़ रहा था। जैसे ही मैंने इसे हटा दिया, सब कुछ काम कर गया। (उसी तरह से DataGridTextColumn में फॉरग्राउंड सेट के लिए चला जाता है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.