繁体   English   中英

自定义嵌套容器控件

[英]Custom nested container control

我正在编写一个自定义控件,该控件由嵌套在普通Panel中的FlowLayoutPanel组成。 FlowLayoutPanel在该类的内部,并且不能被设计者查看(与Tab有所不同, Tab公开了其单独的属性。)设计者添加到Panel任何控件都应该添加到FlowLayoutPanel 这是我到目前为止的内容:

public class SlidePanel : Panel
{
    private FlowLayoutPanel _panel;

    public SlidePanel()
        : base()
    {
        _panel = new FlowLayoutPanel();
        Controls.Add(_panel);
        _panel.Location = new Point(0, 0);
        _panel.Size = base.Size;
        _panel.Anchor = AnchorStyles.Bottom | AnchorStyles.Top;

        ControlAdded += new ControlEventHandler(SlidePanel_ControlAdded);
    }

    void SlidePanel_ControlAdded(object sender, ControlEventArgs e)
    {
        Controls.Remove(e.Control);
        _panel.Controls.Add(e.Control);
    }
}

这适用于在运行时添加的控件,但是当我尝试在设计时添加控件时,它要么说'child' is not a child control of this parent. 或将控件添加到表单中。 我假设有一种更干净,更好的方法来完成此任务?


测试Flynn1179的建议

public class SlideControl : FlowLayoutPanel
{
    private const int SB_HORZ = 0x0;
    private const int SB_VERT = 0x1;

    [DllImport("user32.dll")]
    private static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);
    [DllImport("user32.dll")]
    private static extern int GetScrollPos(IntPtr hWnd, int nBar);

    public SlideControl()
        : base()
    {
        this.MouseMove += new MouseEventHandler(SlideControl_MouseMove);
    }

    void SlideControl_MouseMove(object sender, MouseEventArgs e)
    {
        HScrollPos = e.X;
        VScrollPos = e.Y;
    }

    protected int HScrollPos
    {
        get { return GetScrollPos((IntPtr)this.Handle, SB_HORZ); }
        set { SetScrollPos((IntPtr)this.Handle, SB_HORZ, value, true); }
    }

    protected int VScrollPos
    {
        get { return GetScrollPos((IntPtr)this.Handle, SB_VERT); }
        set { SetScrollPos((IntPtr)this.Handle, SB_VERT, value, true); }
    }
}

您是否考虑过让SlidePanel直接从FlowLayoutPanel继承而不是包含其中一个?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM