2009-03-03 8 views
26

मेरे पास Grid है (डेटाग्रिड नहीं, बल्कि वास्तविक ग्रिड), GridLinesTrue पर सेट है। मैं ग्रिडलाइन का रंग कैसे बदल सकता हूं? एक्सएएमएल में हार्डकोडेड ठीक है, क्योंकि यह सिर्फ विकास के कारणों के लिए है।मैं डब्ल्यूपीएफ में ग्रिड की ग्रिडलाइन का रंग कैसे बदल सकता हूं?

<Grid ShowGridLines="True" /> 
+1

क्या आपका मतलब ग्रिड या डेटाग्रिड है? मुझे ग्रिड पर ग्रिडलाइन संपत्ति नहीं दिखाई दे रही है। – Andy

+2

ग्रिड, डेटाग्रिड नहीं। – Natrium

उत्तर

35

क्षमा करें, शोग्रिडलाइन के साथ नहीं किया जा सकता - आपको निहित तत्वों को शैलीबद्ध करने की आवश्यकता है।

प्रदर्शनी एक:

MSDN डॉक्स कहते हैं कि "केवल बिंदीदार उपलब्ध हैं, क्योंकि इस संपत्ति डिबग लेआउट समस्याओं के लिए एक डिजाइन उपकरण के रूप में इरादा है और उत्पादन की गुणवत्ता कोड में उपयोग के लिए इरादा नहीं है आप लाइनों चाहते हैं। एक ग्रिड के अंदर, ग्रिड के भीतर तत्वों को सीमाओं के लिए शैली दें। "

प्रदर्शनी बी - WPF स्रोत कोड:

सूचना Brushes.Blue और Brushes.Yellow इस में हार्ड-कोडेड आंतरिक वर्ग जो System.Windows.Controls.Grid लाइनों आकर्षित करने के लिए उपयोग करता सील कर दिया।

Grid.cs

से

/// <summary> 
    /// Helper to render grid lines. 
    /// </summary> 
    internal class GridLinesRenderer : DrawingVisual 
    { 
     /// <summary> 
     /// Static initialization 
     /// </summary> 
     static GridLinesRenderer() 
     { 
      s_oddDashPen = new Pen(Brushes.Blue, c_penWidth); 
      DoubleCollection oddDashArray = new DoubleCollection(); 
      oddDashArray.Add(c_dashLength); 
      oddDashArray.Add(c_dashLength); 
      s_oddDashPen.DashStyle = new DashStyle(oddDashArray, 0); 
      s_oddDashPen.DashCap = PenLineCap.Flat; 
      s_oddDashPen.Freeze(); 

      s_evenDashPen = new Pen(Brushes.Yellow, c_penWidth); 
      DoubleCollection evenDashArray = new DoubleCollection(); 
      evenDashArray.Add(c_dashLength); 
      evenDashArray.Add(c_dashLength); 
      s_evenDashPen.DashStyle = new DashStyle(evenDashArray, c_dashLength); 
      s_evenDashPen.DashCap = PenLineCap.Flat; 
      s_evenDashPen.Freeze(); 
     } 
0
<Window.Resources> 
    <SolidColorBrush x:Key="RedGridLine" Color="#FFFF4444" /> 
    <SolidColorBrush x:Key="BlueGridLine" Color="#554444FF"/> 
</Window.Resources> 

<my:DataGrid VerticalGridLinesBrush="{StaticResource RedGridLine}" 
     HorizontalGridLinesBrush="{StaticResource BlueGridLine}" > 
... 
</my:DataGrid> 

रेफरी: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/0202b0dd-38d9-4ad7-8576-d115922aeeec/

+4

मेरी इच्छा है कि यह इतना आसान था। लेकिन यह ** डेटाग्रिड ** के लिए है, और नहीं ** ग्रिड ** ... – surfen

+6

मजेदार। यह वास्तव में मुझे becuz मदद की मैं डेटाग्रिड के लिए खोज रहा था। – dotNET

9
var T = Type.GetType("System.Windows.Controls.Grid+GridLinesRenderer," + 
    " PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); 

var GLR = Activator.CreateInstance(T); 
GLR.GetType().GetField("s_oddDashPen", BindingFlags.Static | BindingFlags.NonPublic).SetValue(GLR, new Pen(Brushes.Black, 1.0)); 
GLR.GetType().GetField("s_evenDashPen", BindingFlags.Static | BindingFlags.NonPublic).SetValue(GLR, new Pen(Brushes.Black, 1.0)); 

myGrid.ShowGridLines = true; 
+0

धन्यवाद +1। ऐसा करने का विचार नहीं किया जाएगा। प्रतिबिंब का उपयोग करके आप इस तथ्य को पार कर सकते हैं कि कक्षा आंतरिक है? –

+0

यदि आप दोनों पेन नारंगी में सेट करते हैं, तो यह आंखों पर बहुत आसान हो जाता है :) – EricG

5

यह जवाब नहीं है कि कैसे वास्तव में ग्रिडलाइनें बदलने के लिए है, लेकिन यह देखने के लिए की तरह आप एक में किया था बनाने के लिए कैसे बहुत आसान तरीका। मुझे यकीन है कि दूसरों के पास ऐसा करने के बेहतर तरीके हैं, लेकिन यहां मैंने अपनी ग्रिडलाइन दिखाने के तरीके को पूरा किया है।

<Grid Height="115" Margin="0,0,0,0" ShowGridLines="False"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="220"/> 
            <ColumnDefinition Width="220"/> 
            <ColumnDefinition Width="200*"/> 
           </Grid.ColumnDefinitions> 
           <Border Grid.Column="0" BorderBrush="White" BorderThickness="1"> 
           </Border> 
           <Border Grid.Column="1" BorderBrush="White" BorderThickness="1">      
           </Border> 
           <Border Grid.Column="2" BorderBrush="White" BorderThickness="1">   
           </Border> 
          </Grid> 

अपने कॉलम परिभाषाएँ या ग्रिड परिभाषा के लिए एक सीमा बनाएँ और Grid.Column संपत्ति जो कुछ भी करने के लिए आप चाहते हैं निर्धारित किया है। फिर आप अपना रंग, मोटाई या शैली निर्धारित कर सकते हैं। मीठे और सरल। मनाइए कि यह किसी और के लिए सहायक हो!

यहाँ इस ग्रिड की एक छवि है:

enter image description here

0

igalk474's answer का एक एक्सटेंशन, के रूप में इस्तेमाल:

<FixedPage.Resources> 
    <local:GridLinesRenderer x:Key="glr" StrokeColor="Black" StrokeWidth="1.0" /> 
</FixedPage.Resources> 

... 

<Grid ShowGridLines="True"> 
... 
</Grid> 

कहाँ local स्थानीय विधानसभा है, और FixedPage किसी भी FrameworkElement है।

using System; 
using System.Reflection; 
using System.Windows; 
using System.Windows.Media; 

namespace mynamespace.xaml { 
    public class GridLinesRenderer : DependencyObject { 

     public static readonly DependencyProperty StrokeWidthProperty = DependencyProperty.Register(
      "StrokeWidth", typeof(double), typeof(GridLinesRenderer), new PropertyMetadata(1.0, OnPropertyChanged) 
     ); 

     public static readonly DependencyProperty StrokeColorProperty = DependencyProperty.Register(
      "StrokeColor", typeof(SolidColorBrush), typeof(GridLinesRenderer), new PropertyMetadata(Brushes.Black, OnPropertyChanged) 
     ); 

     public double StrokeWidth { 
      get { return (double)GetValue(StrokeWidthProperty); } 
      set { SetValue(StrokeWidthProperty, value); } 
     } 

     public SolidColorBrush StrokeColor { 
      get { return (SolidColorBrush)GetValue(StrokeColorProperty); } 
      set { SetValue(StrokeColorProperty, value); } 
     } 

     public GridLinesRenderer() { 
      OnPropertyChanged(this, new DependencyPropertyChangedEventArgs()); 
     } 

     private static void OnPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) { 
      Type T = Type.GetType("System.Windows.Controls.Grid+GridLinesRenderer," + 
       "PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); 
      var glr = Activator.CreateInstance(T); 
      Pen glrPen = new Pen(((GridLinesRenderer)source).StrokeColor, ((GridLinesRenderer)source).StrokeWidth); 
      glr.GetType().GetField("s_oddDashPen", BindingFlags.Static | BindingFlags.NonPublic).SetValue(glr, glrPen); 
      glr.GetType().GetField("s_evenDashPen", BindingFlags.Static | BindingFlags.NonPublic).SetValue(glr, glrPen); 
     } 

    } 
} 
संबंधित मुद्दे