【问题标题】:Why is my customized Windows Forms panel cant handle child controls?为什么我的自定义 Windows 窗体面板无法处理子控件?
【发布时间】:2015-02-10 12:08:42
【问题描述】:

我想扩展一个 System.Windows.Forms.Panel(只是继承)并使用自定义 ControlDesigner。 我使用了一个非常简约的 ControlDesigner 实现,只是覆盖了 GetHitTest。 问题是我的自定义面板实例还没有准备好包含子控件。 我玩了一点 AssociatedComponents 但没有效果。删除自定义设计器属性,效果很好。 有人可以帮我指出什么问题吗???

[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;
    }

【问题讨论】:

  • 请发布您遇到问题的代码示例...
  • 不是特定的代码行是问题所在。但我改变了我的帖子。顺便说一句,我对 stackoverflow 代码编辑器有很多问题。真是个野兽!

标签: windows forms controls components designer


【解决方案1】:

您使用了错误的设计器。尝试从 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);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    相关资源
    最近更新 更多