2014-12-11 3 views
0

Я хочу расширить System.Windows.Forms.Panel (просто наследовать) и использовать пользовательский ControlDesigner. Я использую очень минималистичную реализацию ControlDesigner, просто перезаписываю GetHitTest. Проблема заключается в том, что мой пользовательский экземпляр панели еще не готов содержать дочерние элементы управления. Я немного играю с AssociatedComponents, но без эффекта. Удалите пользовательский атрибут дизайнера, и он отлично работает. может кто-нибудь помочь мне указать, что случилось? ???Почему моя настраиваемая панель управления Windows Forms не поддерживает дочерние элементы управления?

[Designer(typeof(MyPanelDesigner)), ToolboxItem(true)] 
public class MyPanel : System.Windows.Forms.Panel 
{ 
     // empty except for OnPaint 
} 
internal class DrawPanelDesigner : ControlDesigner 
{ 
     private MyPanel ParentControl 
     { 
      get 
      { 
       return Control as MyPanel; 
     } 
    } 

    public override System.Collections.ICollection AssociatedComponents 
{ 
    get 
    { 
     return ParentControl.Controls; 
     } 
    } 

    protected override bool GetHitTest(System.Drawing.Point point) 
    { 
     // hit detection for some owner drawed items in OnPaint 
     point = ParentControl.PointToClient(point); 
     var item = ParentControl.View.GetItemFromViewPoint(point.X, point.Y, true); 
     return null != item; 
    } 
+0

Пожалуйста отправьте образец кода, который вы испытываете проблемы с ... –

+0

не конкретная строка кода является проблемой. но я изменил свое сообщение. btw У меня много проблем с редактором кода stackoverflow. какой зверь! – IDisposable

ответ

0

Вы используете неправильный дизайнер. Попробуйте унаследовать от ScrollableControlDesigner вместо:

internal class DrawPanelDesigner : ScrollableControlDesigner { 

    public DrawPanelDesigner() { 
    AutoResizeHandles = true; 
    } 

    private MyPanel ParentControl { 
    get { 
     return Control as MyPanel; 
    } 
    } 

    protected Pen BorderPen { 
    get { 
     Color penColor = Control.BackColor.GetBrightness() < .5 ? 
         ControlPaint.Light(Control.BackColor) : 
         ControlPaint.Dark(Control.BackColor); 
     Pen pen = new Pen(penColor); 
     pen.DashStyle = DashStyle.Dash; 
     return pen; 
    } 
    } 

    protected virtual void DrawBorder(Graphics graphics) { 
    Panel panel = (Panel)Component; 
    if (panel == null || !panel.Visible) { 
     return; 
    } 

    Pen pen = BorderPen; 
    Rectangle rc = Control.ClientRectangle; 
    rc.Width--; 
    rc.Height--; 

    graphics.DrawRectangle(pen, rc); 
    pen.Dispose(); 
    } 

    protected override void OnPaintAdornments(PaintEventArgs pe) { 
    Panel panel = (Panel)Component; 
    if (panel.BorderStyle == BorderStyle.None) { 
     DrawBorder(pe.Graphics); 
    } 
    base.OnPaintAdornments(pe); 
    } 
} 
Смежные вопросы