Winforms SplitterPanel,子重叠拆分的 z-index
Winforms SplitterPanel, z-index of child overlap split
我在 winforms 中使用 SplitterPanel,在右侧我想要一个显示 2 列下拉列表的自定义下拉列表控件。
问题是,由于有两列,我希望能够拥有比实际下拉列表更大的下拉列表区域,因此如果列表不适合拆分区域,则与 SplitterPanel 重叠。
我试过使用 .BringToFront();
,但这在 SplitterPanel 上不起作用,并且控件被隐藏。我来自网络背景,我会为此使用 z-index,但我对 winforms 感到困惑。请参阅下图我的问题。
有谁知道我该如何解决这个问题?
z-index 将决定哪些 child 控件位置更高,并且可以与其他子控件重叠。但是当你想要一个(真实的而不是下拉菜单或菜单)child 重叠它自己的 container 时,它永远不会有帮助。这永远不会发生;由于 CheckedListBox
是拆分面板的子项,因此它永远不会与它重叠。
您需要让 CheckedListBox
不在分隔面板内,而是在其 Parent
内,因此它们是 'brethren'。假设 SplitContainer
位于 TabPage tabPage8
中。然后你可以通过将它移动到那个 tabPage 来完全显示它:
moveCtlToTarget(tabPage8, checkedListBox1);
使用此功能。
void moveCtlToTarget(Control target, Control ctl)
{
// get screen location of the control
Point pt = ctl.PointToScreen(Point.Empty);
// move to the same location relative to the target
ctl.Location = target.PointToClient(pt);
// add to the new controls collection
ctl.Parent = target;
// move all up
ctl.BringToFront();
}
因为我不知道你是如何创建和显示它的,所以重置它取决于你。请注意,由于它现在不再位于拆分面板中,因此当您移动拆分器时它不会移动..
您可能只想在第一次执行此操作,然后将其与 ComboBox
..
对齐
TaW 上面的回答帮助我解决了我的问题。我针对我的情况稍微修改了它,我将参数移到了方法中,因为我已经将我的复选框控件设置为控件的 属性 并通过循环父项直到我到达顶部来获得目标。
private void moveCtlToTarget()
{
Control Target = Parent;
while (Target.Parent != null)
Target = Target.Parent;
Point pt = CheckBox.PointToScreen(Point.Empty);
CheckBox.Location = Target.PointToClient(pt);
CheckBox.Parent = Target;
CheckBox.BringToFront();
}
我在 winforms 中使用 SplitterPanel,在右侧我想要一个显示 2 列下拉列表的自定义下拉列表控件。
问题是,由于有两列,我希望能够拥有比实际下拉列表更大的下拉列表区域,因此如果列表不适合拆分区域,则与 SplitterPanel 重叠。
我试过使用 .BringToFront();
,但这在 SplitterPanel 上不起作用,并且控件被隐藏。我来自网络背景,我会为此使用 z-index,但我对 winforms 感到困惑。请参阅下图我的问题。
有谁知道我该如何解决这个问题?
z-index 将决定哪些 child 控件位置更高,并且可以与其他子控件重叠。但是当你想要一个(真实的而不是下拉菜单或菜单)child 重叠它自己的 container 时,它永远不会有帮助。这永远不会发生;由于 CheckedListBox
是拆分面板的子项,因此它永远不会与它重叠。
您需要让 CheckedListBox
不在分隔面板内,而是在其 Parent
内,因此它们是 'brethren'。假设 SplitContainer
位于 TabPage tabPage8
中。然后你可以通过将它移动到那个 tabPage 来完全显示它:
moveCtlToTarget(tabPage8, checkedListBox1);
使用此功能。
void moveCtlToTarget(Control target, Control ctl)
{
// get screen location of the control
Point pt = ctl.PointToScreen(Point.Empty);
// move to the same location relative to the target
ctl.Location = target.PointToClient(pt);
// add to the new controls collection
ctl.Parent = target;
// move all up
ctl.BringToFront();
}
因为我不知道你是如何创建和显示它的,所以重置它取决于你。请注意,由于它现在不再位于拆分面板中,因此当您移动拆分器时它不会移动..
您可能只想在第一次执行此操作,然后将其与 ComboBox
..
TaW 上面的回答帮助我解决了我的问题。我针对我的情况稍微修改了它,我将参数移到了方法中,因为我已经将我的复选框控件设置为控件的 属性 并通过循环父项直到我到达顶部来获得目标。
private void moveCtlToTarget()
{
Control Target = Parent;
while (Target.Parent != null)
Target = Target.Parent;
Point pt = CheckBox.PointToScreen(Point.Empty);
CheckBox.Location = Target.PointToClient(pt);
CheckBox.Parent = Target;
CheckBox.BringToFront();
}