2012-05-03 18 views
7

Avere uno standard WinForms 2.0 PropertyGrid control Sto cercando un modo per modificare il colore del bordo del controllo o rimuovere del tutto il bordo.Come modificare il colore del bordo (o rimuovere il bordo) di un controllo PropertyGrid?

enter image description here

Sono consapevole del LineColor property che purtroppo cambia solo i confini interni tra le cellule.

Inoltre, ho utilizzato ILSpy per dare un'occhiata al codice sorgente del controllo PropertyGrid e ancora non ho trovato nulla di significativo per me.

La mia domanda è:

Come rimuovere il bordo esterno di un controllo PropertyGrid o cambiare il colore del bordo esterno?

Aggiornamento 2012-05-04 - Solution (alias "hack"):

Sulla base di Jamie's answer ho assemblato una soluzione di lavoro (which you can download from here):

enter image description here

L'idea è quella di posiziona la griglia di proprietà all'interno di un pannello e lascia che il pannello ritiri il controllo.

Con questo approccio, ho fatto posto il pannello di ritaglio in un altro pannello che ha un Padding di "1" (o quello che volete i confini di essere) e ha dato questo pannello un BackColor che funge da colore del bordo (verde il mio esempio).

Impostare l'Ancora della griglia di proprietà su "Sinistra, Destra, Superiore, Inferiore", impostare lo Dock del pannello di ritaglio su "Completo".

enter image description here

Questo funziona bene per le mie esigenze. Lo vedrei come una specie di hack poiché consuma le risorse di due pannelli che speravo di poter salvare.

risposta

2

questa è un'altra alternativa, come sembra che la mia prima risposta non è adatto a questo particolare controllo. Questo è un trucco sporco, ma dovrebbe funzionare:

Inserisci un pannello di controllo nella finestra o nella finestra di dialogo, diciamo con la dimensione 100H x 300V. Inserisci il propertygrid nel pannello con la posizione -1, -1 e la dimensione 102.302.

+0

Hehe, l'ho già provato in passato, senza successo. Ci riproverò ancora una volta, nel caso avessi fatto qualcosa di sbagliato. –

+0

@Jamie Ha funzionato, grazie per il tuo suggerimento! Aggiornerò la mia domanda con la tua risposta –

+1

Attenzione, questo può byte quando le finestre vengono ridimensionate a causa del ridimensionamento automatico del formato. Si vuole veramente scrivere il codice nel gestore di eventi Resize del pannello per assicurarsi sempre che PropertyGrid sia dove dovrebbe essere. –

1

avrete bisogno di un po 'di interoperabilità per questo:

[DllImport("User32", CharSet=CharSet.Auto)] 
private static extern int SetWindowLong(IntPtr hWnd, int Index, int Value); 
[DllImport("User32", CharSet=CharSet.Auto)] 
private static extern int GetWindowLong(IntPtr hWnd, int Index); 

int GWL_STYLE = -16; 
int WS_BORDER = 0x00800000; 
IntPtr hWnd = yourPropertyGrid.Handle; 

int style = GetWindowLong(hWnd, GWL_STYLE); 
style = style & ~WS_BORDER; 
SetWindowLong(hWnd, GWL_STYLE, style); 
+0

Grazie, @Jamie ho provato questo, ma purtroppo lo stile sembra già di omettere lo stile, eliminando in tal modo che, non cambia. Hai provato la tua soluzione e ha funzionato? –

+1

Ciao Uwe, no, non ho provato, è solo il modo standard per rimuovere il bordo di un controllo nativo di Windows. sembra che il propertygrid non stia seguendo questo standard, quindi penso che non sarai in grado di farlo in questo modo. –

0

questo codice funziona.

private void SetHelpBoderColor(bool showBorder) 
{ 
    if (showBorder) 
    { 
     //Set Default ViewBackColor 
     PropertyInfo viewBackColor = this.propertyGrid.GetType().GetProperty("ViewBorderColor"); 
     if (viewBackColor != null) 
      viewBackColor.SetValue(this.propertyGrid, SystemColors.ControlDark, null); 

     //Set Default HelpBorderColor 
     PropertyInfo helpBorderColor = this.propertyGrid.GetType().GetProperty("HelpBorderColor"); 
     if (helpBorderColor != null) 
      helpBorderColor.SetValue(this.propertyGrid, SystemColors.ControlDark, null); 

    } 
    else 
    { 
     //Set ViewBackColor 
     PropertyInfo viewBackColor = this.propertyGrid.GetType().GetProperty("ViewBorderColor"); 
     if (viewBackColor != null) 
      viewBackColor.SetValue(this.propertyGrid, SystemColors.Control, null); 

     //Set HelpBorderColor 
     PropertyInfo helpBorderColor = this.propertyGrid.GetType().GetProperty("HelpBorderColor"); 
     if (helpBorderColor != null) 
      helpBorderColor.SetValue(this.propertyGrid, SystemColors.Control, null); 
    } 

    if (DesignMode) 
    { 
     Parent.Refresh(); 
    } 
} 
+1

Perché questo codice funziona? –

+0

Sì, quel codice può mostrare o nascondere ViewBoder e HelpBoder in PropertyGrid. – TrungNV

2

Ecco il codice dal mio progetto

PropertyGrid hanno due controlli che hanno bisogno di processo.
+ doccomment è Document help.
+ gridVisualizza il valore della proprietà di visualizzazione.

Questi controlli disegnano il rettangolo del bordo con il colore ControlDark.

Abbiamo bisogno di re disegnare rettangolo con HelpBackColor e LineColor per rendere chiara la vista.

namespace Bravo.Bravo7.UI 
    { 
     public class MyPropertyGrid : PropertyGrid 
     { 
      public class SnappableControl : NativeWindow 
      { 
       private Control _parent; 
       private MyPropertyGrid _ownerGrid; 

       public SnappableControl(Control parent, MyPropertyGrid ownerGrid) 
       { 
        _parent = parent; 
        _parent.HandleCreated += _parent_HandleCreated; 
        _parent.HandleDestroyed += _owner_HandleDestroyed; 

        _ownerGrid = ownerGrid; 
       } 

       protected override void WndProc(ref Message m) 
       { 
        base.WndProc(ref m); 

        switch (m.Msg) 
        { 
         case (int)NativeMethods.WM_NCPAINT: 
         case (int)NativeMethods.WM_PAINT: 

          using (var g = _parent.CreateGraphics()) 
          { 
           using (var pen = new Pen(_ownerGrid.HelpBackColor)) 
           { 
            var clientRectangle = _parent.ClientRectangle; 
            clientRectangle.Width--; 
            clientRectangle.Height--; 
            g.DrawRectangle(pen, clientRectangle); 
           } 
          } 

          break; 
        } 
       } 

       void _owner_HandleDestroyed(object sender, EventArgs e) 
       { 
        ReleaseHandle(); 
       } 

       void _parent_HandleCreated(object sender, EventArgs e) 
       { 
        AssignHandle(_parent.Handle); 
       } 
      } 

      public class PropertyGridView : NativeWindow 
      { 
       private Control _parent; 
       private MyPropertyGrid _ownerGrid; 

       public PropertyGridView(Control parent, MyPropertyGrid ownerGrid) 
       { 
        _parent = parent; 
        _parent.HandleCreated += _owner_HandleCreated; 
        _parent.HandleDestroyed += _owner_HandleDestroyed; 

        _ownerGrid = ownerGrid; 
       } 

       protected override void WndProc(ref Message m) 
       { 
        base.WndProc(ref m); 

        switch (m.Msg) 
        { 
         case (int)NativeMethods.WM_NCPAINT: 
         case (int)NativeMethods.WM_PAINT: 

          using (var g = _parent.CreateGraphics()) 
          { 
           using (var pen = new Pen(_ownerGrid.LineColor)) 
           { 
            g.DrawRectangle(pen, 0, 0, _parent.Width - 1, _parent.Height - 1); 
           } 
          } 

          break; 
        } 
       } 

       void _owner_HandleDestroyed(object sender, EventArgs e) 
       { 
        ReleaseHandle(); 
       } 

       void _owner_HandleCreated(object sender, EventArgs e) 
       { 
        AssignHandle(_parent.Handle); 
       } 
      } 

      public class MyToolStripRenderer : ToolStripSystemRenderer 
      { 
       protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) 
       { 
        //base.OnRenderToolStripBorder(e); 
       } 
      } 

      public MyPropertyGrid() 
      { 
       base.LineColor = SystemColors.Control; 
       base.ViewBackColor = Color.FromArgb(246, 246, 246); 

       base.DrawFlatToolbar = true; 
       base.ToolStripRenderer = new MyToolStripRenderer(); 

       var docDocument = typeof(PropertyGrid) 
        .GetField("doccomment", BindingFlags.NonPublic | BindingFlags.Instance) 
        .GetValue(this) as Control; 

       new SnappableControl(docDocument, this); 

       var gridView = typeof(PropertyGrid) 
        .GetField("gridView", BindingFlags.NonPublic | BindingFlags.Instance) 
        .GetValue(this) as Control; 

       new PropertyGridView(gridView, this); 
      } 

     } 

    } 

Screen Shot

+0

Spiega anche il contesto –

Problemi correlati