2015-09-23 2 views
1

Есть ли способ запретить пользователю использовать Splitter в PropertyGrid Control. Я просматриваю все свойства PropertyGrid Control, но я не нашел, чтобы отключить его. Я ничего не вижу. Есть ли способ сделать это программно. Я использую C# Winforms VS2010.Запретить использование Splitter в PropertyGrid Control

Благодаря

+0

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

ответ

3

Глядя на исходный код для управления PropertyGrid: MSDN PropertyGrid

Для того, чтобы предотвратить горизонтальное поведение делителя, переопределить методы OnMouseDown и OnMouseMove. Чтобы предотвратить поведение вертикального делителя, одним из подходов является использование IMessageFilter и потребление событий мыши, когда местоположение мыши находится вблизи места разделителя.

public class MyForm3 : Form, IMessageFilter { 

    PropertyGrid pg = new MyPropertyGrid { Dock = DockStyle.Fill }; 
    Control gridView = null; 
    MethodInfo miSplittlerInside = null; 

    public MyForm3() { 
     Controls.Add(pg); 
     pg.SelectedObject = new Button { Text = "Bob" }; 

     var f = typeof(PropertyGrid).GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic); 
     gridView = (Control) f.GetValue(pg); 
     miSplittlerInside = gridView.GetType().GetMethod("SplitterInside", BindingFlags.Instance | BindingFlags.NonPublic); 

     Application.AddMessageFilter(this); 
    } 

    private const int WM_MOUSEMOVE = 0x200; 
    private const int WM_LBUTTONDOWN = 0x201; 
    private const int WM_LBUTTONDBLCLK = 0x203; 

    public bool PreFilterMessage(ref Message m) { 
     if (m.HWnd == gridView.Handle) { 
      if (m.Msg == WM_MOUSEMOVE || m.Msg == WM_LBUTTONDOWN || m.Msg == WM_LBUTTONDBLCLK) { 
       Point pt = new Point(m.LParam.ToInt32()); 
       bool inside = (bool) miSplittlerInside.Invoke(gridView, new Object[] { pt.X, pt.Y }); 
       if (inside) { 
        return true; 
       } 
      } 
     } 
     return false; 
    } 

    class MyPropertyGrid : PropertyGrid { 
     protected override void OnMouseMove(MouseEventArgs me) { 
      //base.OnMouseMove(me); 
      // do nothing, prevent user from moving the split bar 
     } 

     protected override void OnMouseDown(MouseEventArgs me) { 
      //base.OnMouseDown(me); 
     } 
    } 
} 

Примечание: Не называя базовые методы будут иметь побочный эффект, который не будет запускаться любые слушатели для этих событий.

Уточнение: код предотвращает фиолетовый сплиттер. Ваш вопрос относится к оранжевому или фиолетовому?

enter image description here

+0

Вы попробовали это? Не имеет никакого эффекта. – LarsTech

+0

@LarsTech Да, я сделал. Это, казалось, сработало, я все же проверю. – Loathing

+0

@LarsTech Я дважды проверял использование 35/40/45, и это определенно отключает возможность захвата разделительной панели. Мышь больше не превращается в курсор «HSplit», и щелчок на разделителе не влияет. – Loathing

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