Пользовательский контроль вложенных контейнеров - PullRequest
0 голосов
/ 19 июля 2010

Я пишу пользовательский элемент управления, который состоит из FlowLayoutPanel, вложенного в обычный Panel. 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., либо вместо этого добавляет элемент управления в форму. Я предполагаю, что есть более чистый, более хороший способ сделать это?


Тест Предложение Флинна1179 :

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

1 Ответ

0 голосов
/ 19 июля 2010

Рассматривали ли вы, что SlidePanel наследуется непосредственно от FlowLayoutPanel, а не содержит его?

...