2012-05-03 29 views
7

Tener un estándar WinForms 2.0 PropertyGrid control Estoy buscando una manera de cambiar el color del borde del control o eliminar el borde por completo.Cómo cambiar el color del borde (o eliminar el borde) de un control PropertyGrid?

enter image description here

Soy consciente de la LineColor property que, desgraciadamente, sólo cambia las fronteras interiores entre las células.

Además, utilicé ILSpy para echar un vistazo al código fuente del control PropertyGrid y todavía no encontré nada significativo para mí.

Mi pregunta es:

Cómo eliminar el borde exterior de un control PropertyGrid o cambiar el color del borde exterior?

actualización 2012-05-04 - Solución (también conocido como "cortar"):

Basado en Jamie's answer que monta una solución de trabajo (which you can download from here):

enter image description here

La idea es coloque la cuadrícula de propiedades dentro de un panel y deje que el panel recorte el control.

Con este enfoque, coloqué el panel de recorte en otro panel que tiene un Padding de "1" (o lo que quiera que sean los bordes) y dí un panel BackColor que sirve como borde (verde en mi ejemplo).

Establezca el ancla de la cuadrícula de propiedades en "Izquierda, Derecha, Arriba, Abajo", establezca Dock del panel de recorte en "Completo".

enter image description here

Esto funciona bien para mis necesidades. Me gustaría ver esto como una especie de truco, ya que consume los recursos de dos paneles que esperaba poder guardar.

Respuesta

2

Ésta es otra alternativa, ya que parece que mi primera respuesta no es adecuado para este control particular. Este es un truco sucio, pero debería funcionar:

Ponga un control Panel en su ventana o diálogo, digamos con un tamaño de 100H x 300V. Coloque la propiedad grid dentro del panel con la posición -1, -1 y el tamaño 102,302.

+0

Hehe, ya lo intenté en el pasado, sin éxito. Lo intentaré de nuevo una vez más, solo en caso de que haya hecho algo mal. –

+0

@Jamie ¡Funcionó, gracias por su sugerencia! Actualizaré mi pregunta con tu respuesta. –

+1

Tenga cuidado, este puede byte cuando las ventanas se cambian de tamaño debido a la escala de forma automática. Realmente desea escribir código en el controlador de eventos de Redimensionar del panel para asegurarse siempre de que PropertyGrid esté donde debería estar. –

1

se necesita un poco de interoperabilidad para ello:

[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

gracias, @Jamie yo probamos este, pero por desgracia, el estilo ya parece omitir el estilo, lo que se quita, no cambia. ¿Has probado tu solución y la has hecho funcionar? –

+1

Hola Uwe, no, no lo he intentado, es solo la forma estándar de eliminar el borde de un control de Windows nativo. parece que el PropertyGrid no sigue este estándar, por lo tanto, creo que no podrá hacerlo de esta manera. –

0

este código funciona.

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

¿Por qué funciona este código? –

+0

Sí, ese código puede mostrar u ocultar ViewBoder y HelpBoder en PropertyGrid. – TrungNV

2

Aquí está el código de mi proyecto

PropertyGrid tienen dos controles que necesitan proceso.
+ doccomment es Ayuda de documento.
+ gridView que muestra el valor de la propiedad.

Esos controles dibujan un rectángulo de borde con el color ControlDark.

Necesitamos dibujar el rectángulo con HelpBackColor y LineColor para tener una vista clara.

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

Explicar el contexto también –

Cuestiones relacionadas