Winforms SplitterPanel,子重叠分割的z-index

时间:2016-09-22 11:14:12

标签: c# winforms custom-controls z-index

我在winforms中使用SplitterPanel,在右侧我想要一个显示2列下拉列表的自定义下拉列表控件。

问题在于,有两列我希望能够拥有比实际下拉列表更大的下拉列表区域,因此如果列表不适合分割区域,则与SplitterPanel重叠。

我已尝试使用.BringToFront();,但这不适用于SplitterPanel并且隐藏了控件。我来自一个网络背景,我会使用z-index,但我对winforms感到难过。请参阅下面的问题图片。

有谁知道如何解决这个问题?

enter image description here

2 个答案:

答案 0 :(得分:1)

z-index将确定哪个控件位于更高位置,并且可以与其他子控件重叠。但是当你想要一个(真实的而不是贬低或暗示)孩子重叠其自己的容器时,它永远不会有帮助。这从未发生过;由于CheckedListBox是拆分面板的子项,因此它永远不会重叠。

您需要让CheckedListBox不在分割器面板内,而是在Parent内,这样他们就是'兄弟'。我们假设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 ..

对齐

答案 1 :(得分:1)

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