2012-05-03 6 views
7

Имея стандартный WinForms 2.0 PropertyGrid control Я ищу способ изменить цвет границы элемента управления или вообще удалить границу.Как изменить цвет рамки (или удалить границу) элемента управления PropertyGrid?

enter image description here

Я знаю о LineColor property, который, к сожалению, только изменяет внутренние границы между ячейками.

Кроме того, я использовал ILSpy, чтобы посмотреть исходный код элемента управления PropertyGrid и все еще не нашел ничего значимого для меня.

Мой вопрос:

Как удалить внешнюю границу с PropertyGrid управления или изменить цвет внешней границы?

Обновление 2012-05-04 - Решение (так называемый "взлом"):

На основе Jamie's answer я собрал рабочий раствор (which you can download from here):

enter image description here

Идея заключается в том, чтобы поместите сетку свойств внутри панели и позвольте панели закрепить элемент управления.

При таком подходе я установил обрезную панель на другую панель, имеющую Padding «1» (или все, что вы хотите, чтобы границы были) и дал этой панели BackColor, который служит в качестве цвета рамки (зеленый в мой пример).

Установите привязку сетки свойств в положение «Влево», «Вправо», «Внизу», «Вниз», установите Dock обрезной панели на «Полный».

enter image description here

Это хорошо работает для моих требований. Я видел бы это как хак, так как он потребляет ресурсы двух панелей, которые я надеялся, что смогу сэкономить.

ответ

2

это еще одна альтернатива, как это кажется, что мой первый ответ не подходит для данного элемента управления. Это грязный трюк, но он должен работать:

Положите панель управления в свое окно или диалог, скажем, размером 100H x 300V. Поместите свойствоgrid внутри панели с позицией -1, -1 и размером 102,302.

+0

Хе-хе, я уже пробовал это в прошлом, безуспешно. Я попробую еще раз, на всякий случай, я сделал что-то не так. –

+0

@Jamie Это сработало, спасибо за ваше предложение! Я отвечу на ваш вопрос с ответом. –

+1

Будьте осторожны, этот может быть байтом, когда размеры окон изменяются из-за автоматического масштабирования формы. Вы действительно хотите написать код в обработчике событий Resize панели, чтобы всегда убедиться, что PropertyGrid - это то, где он должен быть. –

1

вам потребуется немного Interop для этого:

[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

Спасибо, @Jamie Я попытался это, но, к сожалению, стиль уже, кажется, опускает стиль, таким образом, удаляя его, не меняется. Вы пробовали свое решение и работали ли они? –

+1

Привет, Uwe, нет, я не пробовал, это просто стандартный способ удалить границу собственного элемента управления windows. кажется, что свойствоgrid не соответствует этому стандарту, поэтому я думаю, что вы не сможете сделать это таким образом. –

0

этот код работа.

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

Почему этот код работает? –

+0

Да, этот код может показывать или скрывать ViewBoder и HelpBoder в PropertyGrid. – TrungNV

2

Вот код из моего проекта

PropertyGrid имеет два элемента управления, которые нуждаются в процессе.
+ doccomment - Помощь с документами.
+ gridView это значение свойства отображения.

Эти элементы управления рисуют границу прямоугольника с цветом ControlDark.

Нам нужно повторно рисовать прямоугольник с помощью HelpBackColor и LineColor, чтобы сделать четкое представление.

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

Объясните также контекст –

Смежные вопросы