【问题标题】:Scrollbar does not update on changing the scroll value滚动条不会在更改滚动值时更新
【发布时间】:2011-07-30 18:07:18
【问题描述】:

当在Panel 中设置VerticalScroll.Value 并将AutoScroll 设置为true 时,滚动位置会相应更改,但拇指的位置不会。我是否需要以某种方式更新滚动条(面板上的Invalidate(true) 不起作用)?有什么想法吗?

【问题讨论】:

    标签: .net winforms scrollbar


    【解决方案1】:

    尝试拨打.PerformLayout();

    【讨论】:

    • 是的,可以确认,这对我来说在 3 个不同的控件上完美无缺。谢谢。
    • 很好的解决方案。
    【解决方案2】:

    感谢.PerformLayout() 的提示!

    在我的情况下这还不够,我在 Form.Shown 事件处理程序表单中设置 VerticalScroll.Value,出于某种原因,我必须事先添加 DoEvents 指令才能滚动工作。

    这是我的Shown 事件处理程序:

    Private Sub MyForm_Shown(sender As System.Object, e As System.EventArgs) Handles Me.Shown
        System.Windows.Forms.Application.DoEvents()
    
        ScrollPanel.VerticalScroll.Value = ScrollPanel.VerticalScroll.Maximum
        ScrollPanel.PerformLayout()
    End Sub
    

    ScrollPanel 控件的类型为System.Windows.Forms.Panel

    没有Application.DoEvents() 行,垂直滚动值设置被完全忽略。

    我认为它可能对其他人有用。

    【讨论】:

      【解决方案3】:

      我在尝试自动滚动包含图片框的面板时遇到了完全相同的问题。

      我找到了另一种让它工作的方法。将滚动值增加两次:

      ScrollPanel.VerticalScroll.Value += AmountToScroll
      
      ScrollPanel.VerticalScroll.Value += AmountToScroll
      

      第一次增加值会导致图片框在面板内滚动,但 .Value 不会改变,拇指也不会移动。

      第二次增加值会导致VerticalScroll.Value增加,移动拇指,但图片框不再滚动。

      对我来说似乎是一个错误。当然,图片框的滚动和 .Value 的增加以及拇指的移动都应该发生在第一行代码之后。

      【讨论】:

        【解决方案4】:

        我遇到了几乎相同的东西,我在带有滚动条的面板中有一个 PictureBox(显示图表),我想放大或缩小鼠标指针位置“显然”静止。在面板内重新定位 PictureBox 会导致与滚动条不同步,此后,使用滚动条滚动将不会显示 PictureBox 的整个区域。解决方案是通过将计算值分配给 panel.Horizo​​ntalScroll.Value 和/或 panel.VerticalScroll.Value 属性来完成移动。但这还不够:需要这两种解决方案之一才能使应用程序按设计运行:

        1. 上面KMan的解决方案:

          panel.HorizontalScroll.Value = computed_value
          panel.PerformLayout()
          
        2. 或上面 JJMcLellan 的解决方案:在我的情况下,将计算值分配两次,例如:

          panel.HorizontalScroll.Value = computed_value
          panel.HorizontalScroll.Value = computed_value
          

        其中任何一个似乎都有相同的最终结果。由于上面的#2 使它看起来像一个错误,并且#1 似乎(希望)是微软设计的(?),我最终在我的应用程序中使用了#1。我只是想在 VB.NET 环境中确认这两项工作。

        【讨论】:

          【解决方案5】:

          我试图让它在表单上工作。我尝试了 PerformLayout(),我尝试了 Application.DoEvents(),我尝试分配 VerticalScroll.Value 两次,但都没有奏效。我唯一要做的就是将 VerticalScroll 的属性更改为不同的值,然后将其改回:

          protected override void OnVisibleChanged(EventArg e)
          {
              base.OnVisibleChanged(e);
              if (this.Visible)
              {
                  this.VerticalScroll.Maximum++;
                  this.VerticalScroll.Maximum--;
              }
          }
          

          请注意,更改 VerticalScroll.Value 也同样有效,但您必须实际修改其值,并确保更改在最小值到最大值的范围内,这比临时增加最大值要复杂得多。

          【讨论】:

          • OnVisibleChanged 问题可能意味着您的问题与提问者发布的不同。
          • 我认为你是对的......我认为不同之处在于我在打开表单之前设置了滚动条属性,而这个问题是关于定位已经可见的滚动条。我认为值得将这个答案留在问题之下,即使情况略有不同。
          猜你喜欢
          • 1970-01-01
          • 2013-05-29
          • 2011-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-18
          相关资源
          最近更新 更多