【问题标题】:Winforms autoscroll getting lost when controls resize当控件调整大小时,Winforms 自动滚动会丢失
【发布时间】:2012-07-13 08:05:17
【问题描述】:

我有一个显示乘用车座椅布局的用户控件。

它简单地以矩阵形式绘制几个“SeatControl”,具体取决于乘用车的尺寸。

为了更好地观看,主控件会调整“SeatControl”的大小以适应所有可用空间,这意味着 SeatControl 会根据可用空间变大或变小。

这很完美。

但是,当客户区变得太小时,我们会避免将控件缩小太多,否则它们会变形且无法阅读。

在这种情况下,我们打开自动滚动,以便用户可以滚动查看整个布局。

但是,如果我们从小屏幕(带有滚动条)开始,请将其最大化(滚动条将隐藏并且座椅控件会增大尺寸)并恢复窗口大小(滚动将恢复并且座椅控件将缩小到最小尺寸),滚动丢失。

为了清楚起见,图像中的相同操作:

最大化窗口(只显示部分屏幕以避免大图):

并将其恢复(注意滚动条和客户区的布局位置):

此调整大小由以下代码控制:

private void FixSizes()
    {            
        if (mModel == null)
            return;

        this.SuspendLayout();            

        Size clientSize = this.ClientSize;
        Size minimumSize = new Size(SeatUserControl.MinimumDescentSize.Width, SeatUserControl.MinimumDescentSize.Height);

        //Here we try to find the best size for the seat user control to fit all the client area                      
        Size controlSize = new Size(
            Math.Max(clientSize.Width / mModel.Length, minimumSize.Width),
            Math.Max(clientSize.Height / mModel.Width, minimumSize.Height)
        );

        AutoScrollMinSize = new Size(controlSize.Width * mModel.Length, controlSize.Height * mModel.Width);
        this.SetDisplayRectLocation(0, 0);

        for (int row = 0; row < mModel.Width; ++row)
        {
            for (int col = 0; col < mModel.Length; ++col)
            {
                Control control = this.Controls[(row * mModel.Length) + col];

                control.Location = new Point(col * controlSize.Width, row * controlSize.Height);
                control.Size = controlSize;
            }
        }            

        this.ResumeLayout();
    }

而且这个方法很简单,由 OnClientSizeChanged 方法调用:

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

        this.FixSizes();
    }

我能够确定,如果我将 SeatControl 保持在固定大小,问题就会消失,但输出不是很好,因为我们希望 SeatControl 使用最大的可用空间。

所以看起来我错过了或忘记使用自动滚动设置执行某些操作,因此它不会丢失。有什么想法吗?

【问题讨论】:

  • 您是否尝试过使用面板的 Dock 设置来伸展,以防您使用面板进行座位布局?
  • @SivaGopal:我没有,SeatControls 直接插入到 UserControl 上。但是如果我使用扩展坞,我会丢失卷轴,对吧?
  • 假设您正在使用某种父容器,例如面板,或者会限制 SeatControl 最大化大小的东西,请使用停靠栏“填充”(中间那个)。这将自动为您调整控件的滚动条。
  • @KreepN 包含所有 SeatsControls 的用户控件很简单,可以将座位保持在自身上。我现在添加了一个将 Dock 设置为“填充”的新面板,并用座椅控件填充了这个面板。它似乎工作得很好!谢谢!
  • @KreeN 我的第一个设计是使用 tablelayout,但我无法让它在添加/删除控件和调整大小时正常工作。在这种情况下,手动控制控件会产生更简单、更令人惊讶、快速的代码。谢谢。

标签: c# .net winforms datagridview scroll


【解决方案1】:

来自 cmets 的解决方案:

假设您正在使用某种父容器,例如面板,或者会限制 SeatControl 最大化大小的东西,请使用停靠栏“填充”(中间的)。这将自动为您调整控件的滚动条。

对于未来的读者,使用 Dock: Fill 属性时的结果如下所示:

请注意由于 gridview 控件大于其父容器而自动生成的滚动条。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2011-08-29
    相关资源
    最近更新 更多