【问题标题】:flickering scroll bar on side of panel whenever I use a vscrollbar I made每当我使用我制作的 vscrollbar 时,面板侧面的滚动条都会闪烁
【发布时间】:2021-02-15 11:26:17
【问题描述】:

我有一个带有图片框的面板,我制作了一个单独的 vscrollbar,因为我不太喜欢启用自动滚动时面板生成的那个,所以我让右侧的滚动条工作,但每当我使用它时面板侧面的滚动条开始闪烁,只有当我使用我制作的滚动条时它才可见,但它会疯狂闪烁,直到我停止移动 vscrollbar,这是形式:

这就是我在滚动条和面板的代码中得到的

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MetroFramework.Forms;
using MetroFramework;

namespace WindowsForm1
{
    public partial class Form2 : MetroForm
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
        {
            panel1.VerticalScroll.Visible = false;
            vScrollBar1.Refresh();
            panel1.Refresh();
            panel1.Select();
            panel1.VerticalScroll.Value = 0;
            panel1.AutoScroll = false;
            panel1.VerticalScroll.Enabled = false;
        }

        private void panel1_Scroll(object sender, ScrollEventArgs e)
        {
            panel1.Invalidate();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            VerticalScroll.Enabled = false;
            VerticalScroll.Visible = false;
            AutoScroll = false;
        }
    }
}

我所做的一切似乎都无法解决问题

【问题讨论】:

  • 您是否尝试过双缓冲面板?
  • 是的,但它并没有真正改变任何东西

标签: c#


【解决方案1】:

AutoScroll 属性应设置为true,以使Panel 具有虚拟大小。虚拟大小是控件本身的大小加上容纳子控件所需的大小。它是自动计算的,它是DisplayRectangle 属性的大小。只要大小发生变化,内部的VScrollHScroll 控件就会相应地更新。

作为解决此问题的方法,您可以使用 outer Panel 隐藏 inner Panel 的垂直滚动条,并使用自定义 @ 987654334@ 设置滚动位置。 This文章就是一个例子。

在设计器中,删除一个新的Panel 来托管主要的并编辑代码如下。

public partial class Form2 : MetroForm
{
    public Form2()
    {
        InitializeComponent();

        pnlOuter.AutoScroll = false; // The new Panel.
        pnlInner.AutoScroll = true;  // The PictureBox controls Panel.
        pnlInner.AutoScrollMargin = new Size(0, 20);

        pnlInner.MouseWheel += (s, e) =>
            vScrollBar1.Value = pnlInner.VerticalScroll.Value;

        pnlOuter.Resize += (s, e) => ResetVScrollBar();

        vScrollBar1.Scroll += (s, e) =>
        {
            pnlInner.AutoScrollPosition = new Point(0, vScrollBar1.Value);
            pnlInner.VerticalScroll.Value = vScrollBar1.Value;
        };
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        ResetVScrollBar();
    }

    private void ResetVScrollBar()
    {
        if (pnlInner.Width == 0 || pnlInner.Height == 0) return;

        pnlInner.SetBounds(0, 0,
            pnlOuter.Width + SystemInformation.VerticalScrollBarWidth * 2,
            pnlOuter.Height);

        vScrollBar1.Minimum = pnlInner.VerticalScroll.Minimum;
        vScrollBar1.Maximum = pnlInner.DisplayRectangle.Height;
        vScrollBar1.LargeChange = vScrollBar1.Maximum / vScrollBar1.Height + pnlInner.Height;
        vScrollBar1.SmallChange = 15;
        vScrollBar1.Value = Math.Abs(pnlInner.AutoScrollPosition.Y);
        vScrollBar1.Enabled = pnlInner.Height < vScrollBar1.Maximum;
    }
}

【讨论】:

    猜你喜欢
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多