【问题标题】:Custom nested container control自定义嵌套容器控件
【发布时间】:2011-03-17 22:39:33
【问题描述】:

我正在编写一个自定义控件,该控件由嵌套在普通Panel 中的FlowLayoutPanel 组成。 FlowLayoutPanel 是类内部的,设计人员不能查看(与 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's suggestion的测试:

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

【问题讨论】:

    标签: c# winforms custom-controls components containers


    【解决方案1】:

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

    【讨论】:

    • SlidePanel 将来回移动FlowLayoutPanel(因此Slide,)所以它需要是一个单独的容器。
    • 以什么方式?您可以使用填充设置来操纵内容的位置
    • 类似于滚动条的工作方式,但在鼠标悬停时自动完成,没有滚动条。重点是允许用户拖放到一长串控件上。
    • 啊,我明白了.. 我认为这应该仍然有效;如果将WrapContents 属性设置为false,则内容将仅排列在一条长水平线上。不过,您仍然需要使用鼠标悬停机制手动设置滚动位置。
    • 我仍然不确定我应该如何来回移动它们......显然,我并没有试图来回移动整个 control ,只是控件的子级,在 FLP 中,这些子级是自动布局的。
    猜你喜欢
    • 1970-01-01
    • 2019-04-11
    • 2012-07-01
    • 1970-01-01
    • 2015-08-24
    • 2010-09-23
    • 1970-01-01
    • 2022-01-08
    • 2018-04-03
    相关资源
    最近更新 更多