2012-07-13 76 views
3

我有一个显示乘客座位布局的用户控件。当控件调整大小时,Winforms自动滚屏会丢失

根据乘用车的大小,它可以简单地在矩阵中绘制几个“SeatControl”。

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

这工作完美。

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

在这种情况下,我们打开自动滚动,以便用户可以滚动查看整个布局。但是,如果我们从一个小屏幕(带滚动条)开始,将其最大化(滚动条将隐藏并且座位控件增加大小)并将窗口大小恢复(滚动将回来并且座位控件将缩小到最小尺寸),滚动会丢失。

要清楚,在图像相同的操作: small layout with vertical scroll bar

最大化窗口(仅适用于部分屏幕显示,以避免大图):

partial full screen, notice that scroll has gone as expected

而且其恢复(请注意滚动条和客户区域上的布局位置): but on scroll bar

此调整大小由代码b elow:

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使用最大可用空间。

所以它看起来像我失踪或忘记做自动滚动设置的东西,所以它不会迷路。有任何想法吗?

+0

+1问题详细信息 – Rafal 2012-07-13 13:08:19

+0

您是否尝试将面板的Dock设置拉伸,以防您正在使用面板进行座位布局? – 2012-07-13 13:42:38

+0

@SivaGopal:我没有,SeatControl直接插入UserControl。但是如果我使用码头,我会失去滚动,对吧? – bcsanches 2012-07-13 13:45:53

回答

2
从评论

解决方案:

假设你正在使用某种形式的父容器,如面板,或一些会限制SeatControl的最大尺寸,使用码头“填充”​​(中心之一) 。这将自动为您调整滚动条。

对于未来的读者,结果是这样的使用船坞时:填写属性:

enter image description here

注意,这是自动生成的,由于GridView控件比其父容器较大的滚动条。

相关问题