【问题标题】:Mantain a control position fixed when scrolling a panel滚动面板时保持控制位置固定
【发布时间】:2009-12-24 11:25:32
【问题描述】:

我在父面板 panel1 中滚动的大型自定义面板 panel2 的左中部有一个标签 label1。 p>

alt text http://lh4.ggpht.com/_1TPOP7DzY1E/SzNN2g9Sv4I/AAAAAAAAC1U/A_LlLOoejX8/s800/formScroll.png

我会label1 始终保持在 panel2 的可见左侧中间,即使在滚动时也是如此。

在实际示例中,我的面板是一个用户控件,在其左侧生成一些标签。面板滚动,但我需要保持标签始终可见。

如何实现?

这是我的代码:

public partial class Form1 : Form
{
    public Form1()
    {
        this.InitializeComponent();
    }

    protected Point clickPosition;
    protected Point scrollPosition;

    private void panel2_MouseDown(object sender, MouseEventArgs e)
    {
        this.clickPosition = e.Location;
    }

    private void panel2_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            this.SuspendLayout();
            this.scrollPosition += (Size)clickPosition - (Size)e.Location;
            this.panel1.AutoScrollPosition = scrollPosition;
            this.ResumeLayout(false);
        }
    }
}

【问题讨论】:

    标签: .net winforms .net-2.0 scroll


    【解决方案1】:

    嗯,技术上是可以的,只需要在面板滚动时调整控制位置即可。例如:

      public partial class Form1 : Form {
        public Form1() {
          InitializeComponent();
          mPicturePos = pictureBox1.Location;
        }
        Point mPicturePos;
        private void panel1_Scroll(object sender, ScrollEventArgs e) {
          pictureBox1.Location = mPicturePos;
        }
      }
    

    但是,当您滚动面板时,您会看到控件将开始执行 pogo。这里的问题是 Windows 太有用了。它使用快速 bitblt 滚动窗口本身的内容,然后仅针对需要重新绘制的窗口部分发送绘制请求。

    它通过名为“拖动时显示窗口内容”的系统选项来执行此操作,该选项可在控制面板中显示小程序的外观 + 效果对话框中找到。您不能合理地关闭此选项,它具有系统范围的影响。在 Win7 上它甚至不再暴露。

    除了一个简单的解决方法之外,没有好的解决方法:不要将控件放在面板中。只要确保它位于面板顶部即可。这在设计器中可能有点棘手,请将其放在面板旁边(必要时放在前面)并手动编辑 Location 属性。

    【讨论】:

    • 我认为在我的示例中我应该使用 panel2 而不是 pictureBox1 ...但是。我试过你的代码 - 任何改变。我需要保留标签而不是 panel2(代码中的图片框)
    • 呃,我的建议是不要将控件放在面板中。
    • 在实际示例中,我的面板是一个用户控件,在其左侧生成(创建和Controls.Add)一些标签。面板滚动,但我需要保持标签始终可见。我将用这些信息完成问题。
    • 简单:不要将标签添加到面板,将它们添加到 UserControl。
    • @nobugs: :) 我的面板 生成标签的用户控件...也许我需要“检索”面板(UsCtrl)的 parent 但我永远无法确定父级是什么以及我想放置标签的位置是什么..
    【解决方案2】:

    海瑟里奥,

    看看这个它与你的问题有关..但我不知道它是否能解决你的问题无论如何试一试Maintaining the size and position of the Control in the form

    还有这个 Maintain scroll position of treeview

    【讨论】:

    • 谢谢,潘迪亚。不幸的是,这些线程中的任何一个都不能解决我的问题。我不能使用 TableLayoutPanel,label1 应该在 panel2 内部。 ThreeView 案也不是我的案子。
    【解决方案3】:
        public Form1()
        {
            this.InitializeComponent();
            panel2.Paint += new PaintEventHandler(panel2_Paint);
        }
    
        void panel2_Paint(object sender, PaintEventArgs e)
        {
            label1.Location = 
                new Point(-panel1.AutoScrollPosition.X, label1.Location.Y);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      相关资源
      最近更新 更多