2012-05-03 19 views
7

Posiadanie standardowej wersji WinForm 2.0 2.Szukam sposobu na zmianę koloru obramowania kontrolki lub całkowite usunięcie obramowania.Jak zmienić kolor obramowania (lub usunąć obramowanie) kontrolki PropertyGrid?

enter image description here

Jestem świadomy LineColor property która niestety tylko zmienia wewnętrzne granice między komórkami.

Dodatkowo użyłem ILSpy, aby rzucić okiem na kod źródłowy kontrolki PropertyGrid i nadal nie znalazłem nic dla mnie znaczącego.

Moje pytanie brzmi:

Jak usunąć zewnętrzną granicę kontroli PropertyGrid lub zmienić kolor granicy zewnętrznej?

Aktualizacja 2012-05-04 - Solution (aka "hack"):

podstawie Jamie's answer I zmontowane roztwór roboczy (which you can download from here):

enter image description here

Chodzi o to, aby umieść kratkę właściwości w panelu i pozwól panelowi skontrolować sterowanie.

Dzięki temu podejściu umieściłem panel przycinający w innym panelu z numerem Padding "1" (lub czymkolwiek, co ma być granice) i nadałem temu panelowi BackColor, który służy jako kolor obramowania (zielony w mój przykład).

Ustaw Anchor siatki właściwości na "Left, Right, Top, Bottom", ustaw Dock panelu przycinającego na "Full".

enter image description here

Działa to dobrze dla moich wymagań. Postrzegałbym to jako rodzaj hackowania, ponieważ zużywa zasoby dwóch paneli, które miałem nadzieję zaoszczędzić.

Odpowiedz

2

to kolejna alternatywa, gdyż wydaje się, że moja pierwsza odpowiedź nie nadaje się do tej konkretnej kontroli. To jest brudna sztuczka, ale powinna działać:

Umieść kontrolkę Panel w swoim oknie lub oknie dialogowym, powiedzmy o rozmiarze 100H x 300V. Umieść właściwość we wnętrzu panelu z pozycją -1, -1 i rozmiarem 102,302.

+0

Hehe, już próbowałem tego w przeszłości, bez powodzenia. Spróbuję jeszcze raz, na wszelki wypadek, jeśli zrobię coś nie tak. –

+0

@Jamie To działało, dziękuję za sugestię! Zaktualizuję moje pytanie z twoją odpowiedzią. –

+1

Uważaj, ten bajt można zmienić podczas zmiany rozmiaru okna z powodu automatycznego skalowania formularza. Naprawdę chcesz napisać kod w module obsługi zdarzeń Resize panelu, aby zawsze upewnić się, że właściwość PropertyGrid jest tam, gdzie powinna być. –

1

trzeba będzie trochę współdziałanie na to:

[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

podziękować @Jamie próbowałem tego, ale niestety już styl wydaje się pominąć styl, usuwając go nie zmienia. Czy próbowałeś swojego rozwiązania i działało? –

+1

Cześć Uwe, nie, nie próbowałem, to tylko standardowy sposób na usunięcie granicy natywnego sterowania oknami. wydaje się, że propertygrid nie przestrzega tego standardu, więc myślę, że nie będziesz w stanie zrobić tego w ten sposób. –

0

ten kod działa.

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

Dlaczego ten kod działa? –

+0

Tak, ten kod może pokazać lub ukryć ViewBoder i HelpBoder w PropertyGrid. – TrungNV

2

Oto kod z mojego projektu

PropertyGrid dwie kontrole, które wymagają procesu.
+ doccomment to dokument pomocy.
+ gridView, która wyświetla wartość właściwości.

Kontrolki te rysują prostokąty obramowania z kolorem ControlDark.

Potrzebujemy ponownie rysować prostokąt za pomocą HelpBackColor i LineColor, aby uzyskać wyraźny widok.

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

Wyjaśnij także kontekst –

Powiązane problemy