【问题标题】:Scrollbar handling scroll event in winforms滚动条处理winforms中的滚动事件
【发布时间】:2017-04-21 15:35:14
【问题描述】:

我正在创建一个看起来像这样的表单。

Form1 有两个面板:

  • 底部面板(黄色)
  • 顶部面板,它本身由两个面板组成:
    • 左侧面板(红色)
    • 右侧面板(绿色)

如图所示,顶部面板超出了 form1 的高度,所以我想使用滚动条。我有几个问题:

a) 在顶部面板中将自动滚动设置为 true 不起作用。

b) 如果我在顶部面板上放置一个位置超过 form1 高度的按钮,那么它会滚动,但如果我将它放在它的任何子面板(红色或绿色)中,则不会滚动

c) 我可以创建自己的滚动条,而不是在顶部面板中将 auto-scroll 设置为 true,但是我找不到一个简单的示例来处理移动面板的滚动事件,以便视口更改为想要的。

如何正确添加具有所需行为的滚动条?

【问题讨论】:

  • 你想在哪里有滚动条,在表单上还是在黄色面板上?
  • @vendettamit 我想在由红色和绿色面板组成的“顶部”面板中添加一个垂直滚动条
  • 这三个面板看起来都应该停靠——底部、左侧和填充。为您希望滚动条显示的面板设置 AutoScrollMinSize。
  • @de3 你能在 VS 中打开Document Outline 窗口并在表单上添加面板层次结构的屏幕截图吗?
  • AutoScroll 无效,因为面板没有任何需要滚动条才能完全可见的子控件。这就引出了为什么你想要一个滚动条的问题。设置面板的 AutoScrollMinSize 是另一种强制滚动条的方法。再说一次,也许您实际上是在寻找表单的 AutoScroll 属性。

标签: c# winforms


【解决方案1】:

正如 LarsTech 和 Hans Passant 建议的那样,AutoScrollMinSize 起作用了,所以 a 和 b 问题都解决了。

关于问题 C,我认为有一种方法可以创建滚动条,这样它的行为就像我猜想 99% 的滚动条应该有的行为一样(只是为了移动所需的面板)。最后,我自己编写了这个逻辑。

我添加了一个 Scrollbar1 作为基本窗体的控件。 initialPanelY 被构造函数捕获。

这是响应滚动事件的代码。我只是根据滚动条值移动面板 panelRest2 的 Y 位置

using System;
 .
 .
using System.Windows.Forms;

namespace WindowsFormMyTests
{
  public partial class Form1 : Form
  {
    int initialPanelY;
    public Form1()
    {
        InitializeComponent();
        initialPanelY = this.panelRest2.Location.Y;
    }

    private void vScrollBar1_Scroll(object  sender, ScrollEventArgs e)
    {
        int v = (sender as VScrollBar).Value; //between 1 and 100
        int hiddenPanelHeight = this.panelRest2.Size.Height - this.Size.Height;
        float moveY = (float)hiddenPanelHeight * ((float)v / 100);
        int newY = initialPanelY - (int)moveY;
        this.panelRest2.Location = new Point(this.panelRest2.Location.X, newY);
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多