Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在滚动面板时保持固定的控制位置 我在一个大的自定义面板Panel2的中间有一个标签Label1,它在父面板Panel1.0/P>中滚动。_.net_Winforms_.net 2.0_Scroll - Fatal编程技术网

.net 在滚动面板时保持固定的控制位置 我在一个大的自定义面板Panel2的中间有一个标签Label1,它在父面板Panel1.0/P>中滚动。

.net 在滚动面板时保持固定的控制位置 我在一个大的自定义面板Panel2的中间有一个标签Label1,它在父面板Panel1.0/P>中滚动。,.net,winforms,.net-2.0,scroll,.net,Winforms,.net 2.0,Scroll,我会将标签1始终保持在面板2的可见左中间,即使在滚动时也是如此。 在实际示例中,“我的面板”是一个用户控件,它在其左侧生成一些标签。面板会滚动,但我需要保持标签始终可见 如何实现这一目标 这是我的代码: public partial class Form1 : Form { public Form1() { this.InitializeComponent(); } protected Point clickPosition; prote

我会将标签1始终保持在面板2的可见左中间,即使在滚动时也是如此。


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

如何实现这一目标

这是我的代码:

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);
        }
    }
}
海瑟希奥

看看这个,它与你的问题有关。。但我不知道它是否能解决你的问题,无论如何,试试看

这个呢

海瑟罗

看看这个,它与你的问题有关。。但我不知道它是否能解决你的问题,无论如何,试试看

这个呢

从技术上讲,这是可能的,当面板滚动时,您只需调整控制位置即可。例如:

  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属性。

从技术上讲,这是可能的,您只需要在面板滚动时调整控件位置。例如:

  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      mPicturePos = pictureBox1.Location;
    }
    Point mPicturePos;
    private void panel1_Scroll(object sender, ScrollEventArgs e) {
      pictureBox1.Location = mPicturePos;
    }
  }
    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);
    }
但是,当您滚动面板时,您会看到控件将开始执行pogo。这里的问题是Windows太有用了。它用一个快速的bitblt滚动窗口本身的内容,然后只发送需要重新绘制的窗口部分的绘制请求

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


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

谢谢,Pandiya。不幸的是,这些线程中的任何一个都不能解决我的问题。我不能使用TableLayoutPanel,label1应该位于panel2的内部。ThreeView的案子也不是我的谢谢Pandiya。不幸的是,这些线程中的任何一个都不能解决我的问题。我不能使用TableLayoutPanel,label1应该位于panel2的内部。ThreeView案例也不是我的。我认为我应该使用panel2而不是示例中的pictureBox1。。。但是我尝试了你的代码-任何更改。我需要保留标签而不是panel2(代码中的PictureBox)。呃,我的建议是不要将控件放在面板中。在实际示例中,我的面板是一个用户控件,它在其左侧生成(创建并控制.Add)一些标签。面板会滚动,但我需要保持标签始终可见。我将用这些信息来完成这个问题。简单:不要将标签添加到面板,而是将它们添加到UserControl。@nobugs::)我的面板是生成标签的用户控件。。。也许我需要“检索”面板(UsCtrl)的父级,但我永远无法确定父级是什么,以及我希望放置标签的位置是什么..我认为我应该使用panel2而不是示例中的pictureBox1。。。但是我尝试了你的代码-任何更改。我需要保留标签而不是panel2(代码中的PictureBox)。呃,我的建议是不要将控件放在面板中。在实际示例中,我的面板是一个用户控件,它在其左侧生成(创建并控制.Add)一些标签。面板会滚动,但我需要保持标签始终可见。我将用这些信息来完成这个问题。简单:不要将标签添加到面板,而是将它们添加到UserControl。@nobugs::)我的面板是生成标签的用户控件。。。也许我需要“检索”面板(UsCtrl)的父级,但我永远无法确定父级是什么,以及我想放置标签的位置。。
    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);
    }