Сохранять контрольную позицию фиксированной при прокрутке панели - PullRequest
1 голос
/ 24 декабря 2009

У меня есть метка label1 в середине слева от большой пользовательской панели panel2 , которая прокручивается на родительской панели panel1 .

альтернативный текст http://lh4.ggpht.com/_1TPOP7DzY1E/SzNN2g9Sv4I/AAAAAAAAC1U/A_LlLOoejX8/s800/formScroll.png

Я бы оставил label1 всегда в видимой левой средней части панели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);
        }
    }
}

Ответы [ 3 ]

1 голос
/ 24 декабря 2009

Ну, это технически возможно, вам просто нужно отрегулировать положение управления при прокрутке панели. Например:

  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 слишком полезна. Он быстро прокручивает содержимое самого окна, а затем отправляет запрос рисования только для тех частей окна, которые необходимо перекрасить.

Это выполняется с помощью системной опции «Показать содержимое окна при перетаскивании», доступной в диалоговом окне «Внешний вид + эффекты» апплета «Дисплей» на панели управления. Вы не можете разумно отключить эту опцию, она имеет общесистемные эффекты. На Win7 он даже больше не выставляется.

Для этого нет хорошего обходного пути, кроме простого: не помещайте элемент управления в панель. Просто убедитесь, что он расположен в верхней части панели. Это может быть немного сложнее в конструкторе, поместите его рядом с панелью (при необходимости переместите на передний план) и отредактируйте свойство Location вручную.

0 голосов
/ 08 января 2010
    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);
    }
0 голосов
/ 24 декабря 2009

Хай Серхио,

Взгляните на это, это связано с вашим вопросом. Но я понятия не имею, решит ли это вашу проблему, попробуйте Сохранение размера и положения элемента управления в форме

и этот Сохранение позиции прокрутки в виде дерева

...