autoscroll
コントロールが左上ではなく下または右への過成長である場合にのみ発生することにどのように対処しますか?
私は説明します:パネルをwinformに配置し、パネル内にボタンを配置します。ボタンの位置を -20、-20 のようにマイナスにします。スクロールバーが表示されない
この男は同じ疑問を持っていましたが、回答は、このプロジェクトのオプションではない WPF に移行することを提案しました。
それはスクロールの仕組みではありません。パネルの論理的な左上隅は常に (0,0) です。そして、スクロールバーが 0 の左上隅に常に表示されます。
パネルの AutoScrollMinSize プロパティを 20x20 大きくし、すべてのコントロールを +20,+20 だけ移動するだけで、探しているのとまったく同じ結果が得られます。もちろん、そのボタンが表示されます。スクロールバーも同様に調整され、範囲が広くなりました。AutoScroll を使用する場合は、コントロールを移動するだけで十分です。
コントロールは、コンテナー内に表示されるように、常に正の Location.X および Y 値を持っている必要があります。
at (0, 0) を追加してから、パネルの表示領域を右下に移動することで、パネルから左上の領域にボタンを追加することをシミュレートできます。
ボタンの位置を (-20, -20) にする代わりに (0, 0) にします。次に、パネル内の他のすべてのコントロールを反復処理し、それぞれ 20 ピクセル右と 20 ピクセル下に移動します。最後に、パネルを右下にスクロールします。
private void Form1_Load(object sender, EventArgs e)
{
btnResetPosition_Click(sender, e);
}
private void btnMoveToUpperLeft_Click(object sender, EventArgs e)
{
//Set Panel View to upper-left before moving around buttons
panel1.VerticalScroll.Value = panel1.VerticalScroll.Value = panel1.VerticalScroll.Minimum;
panel1.HorizontalScroll.Value = panel1.HorizontalScroll.Value = panel1.HorizontalScroll.Minimum;
//Move button1 to "upper-left"
button1.Location = new Point(0, 0);
//Adjust "static" controls right and down to simulate moving button1
button2.Location = new Point(button2.Location.X + 200, button2.Location.Y + 200);
button3.Location = new Point(button3.Location.X + 200, button3.Location.Y + 200);
//Scroll to show "static" controls in panel
panel1.VerticalScroll.Value = panel1.VerticalScroll.Value = panel1.VerticalScroll.Maximum;
panel1.HorizontalScroll.Value = panel1.HorizontalScroll.Value = panel1.HorizontalScroll.Maximum;
}
private void btnResetPosition_Click(object sender, EventArgs e)
{
//Set Panel View to upper-left before moving around buttons
panel1.VerticalScroll.Value = panel1.VerticalScroll.Value = panel1.VerticalScroll.Minimum;
panel1.HorizontalScroll.Value = panel1.HorizontalScroll.Value = panel1.HorizontalScroll.Minimum;
//Line up all three buttons
button1.Location = new Point(19, 17); // 19 and 17 are used so that when panel scrollbars appear, "static" controls appear to stay in the same place
button2.Location = button1.Location;
button2.Location = new Point(button1.Location.X, button1.Location.Y + 29);
button3.Location = button2.Location;
button3.Location = new Point(button2.Location.X, button2.Location.Y + 29);
}
サンプル コードを実行するには、"panel1" を "Form1" というフォームに追加します。panel1 のサイズを (111, 115) に変更します。「button1」、「button2」、「button3」という 3 つのボタンを panel1 に追加します。「btnMoveToUpperLeft」と「btnResetPosition」という 2 つのボタンをフォームに追加します。サンプル コードを Form1.cs に貼り付けます。
スクロールバーを値と等しく設定するだけでスクロールバーが更新されないというバグがあるため、スクロールバーを移動するためのコードがおかしいことに注意してください。(パネルを手動でスクロールするには? )