Я пишу пользовательский элемент управления, который состоит из 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); }
}
}