首页 > 解决方案 > 使用 Left Dock 时出现 AutoScroll 问题 - C# Telerik Winforms

问题描述

这是我的代码:

RadScrollablePanel panel = new RadScrollablePanel() { AutoScroll = true, Dock = DockStyle.Fill};
pnlclp.PanelContainer.Controls.Add(panel);
foreach (var date in dates)
    panel.Controls.Add(new ucDetails() { Dock = DockStyle.Left });

我在 a 中添加了一些控件RadScrollablePanel,然后将其添加到PanelContainer. 一切都很好。如果我在其中添加了这么多RadScrollablePanel在第一眼中不可见的控件,滚动条也会显示出来。

但是如果我在foreach循环中更改为DockStyle.LeftDockStyle.Right加载控件后,它不会显示滚动条,这很奇怪,我找不到任何理由或解决方案来解决这个问题。

我什至尝试更改RightToLeft. RadScrollablePanel但没有成功:(

有什么建议吗?

标签: c#winformstelerik

解决方案


要解决标准 Microsoft WinForms 面板的这个问题,我可以建议将所有 UserControls 停靠在左侧,并使用一个空面板来占据表单左侧的所有可用空间,因此与停靠所有 UserControls 的行为完全相同向右。当表单的大小改变时,调整空面板的宽度。下面的代码说明了所描述的方法:

public partial class Form1 : Form
{
    UserControl1[] userControls;
    RadScrollablePanel parentPanel;
    Panel spacePanel;

    public Form1()
    {
        InitializeComponent();

        new Telerik.WinControls.RadControlSpy.RadControlSpyForm().Show();
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        this.parentPanel = new RadScrollablePanel();
        this.parentPanel.Dock = DockStyle.Fill;

        this.parentPanel.BackColor = Color.Yellow;

        this.Controls.Add(this.parentPanel);
        this.parentPanel.AutoScroll = true;

        int count = 10;
        this.userControls = new UserControl1[count];

        for (int i = 0; i < count; i++)
        {
            this.userControls[i] =
                new UserControl1()
                {
                    Dock = DockStyle.Left,
                    BackColor = Color.FromKnownColor((KnownColor)(i + 50))
                };

            this.parentPanel.Controls.Add(this.userControls[i]);
        }

        this.spacePanel = new Panel();
        this.spacePanel.Dock = DockStyle.Left;
        this.parentPanel.Controls.Add(this.spacePanel);
    }

    protected override void OnSizeChanged(EventArgs e)
    {
        base.OnSizeChanged(e);

        if (this.spacePanel != null)
        {
            int lastPanelWidth = this.parentPanel.Width;
            foreach (Control control in this.parentPanel.PanelContainer.Controls)
            {
                if (control.Dock == DockStyle.Left && control != this.spacePanel)
                {
                    lastPanelWidth -= control.Width;
                }
            }

            if (lastPanelWidth < 0)
            {
                lastPanelWidth = 0;
            }

            this.spacePanel.Width = lastPanelWidth;
        }
    }
}

推荐阅读