System.Windows.Forms.Panel
にコンテンツがあります。
プログラムでパネルを(垂直に)上下にスクロールしようとしています。
パネルでAutoScrollPosition
プロパティを新しいPoint
に設定しようとしましたが、それができないようです。
AutoScroll
プロパティをtrueに設定しています。
提案されたようにVerticalScroll.Value
を2回設定しようとさえしました ここ ですが、それでもうまくいかないようです。
これは私が現在していることです:
//I have tried passing both positive and negative values.
panel.AutoScrollPosition = new Point(5, 10);
AutoScrollPositionのXとYの値は0と0のままです。
これに関するヘルプや指示は大歓迎です。
前もって感謝します、
マーワン
これが解決策です。 Win32
を使用してPanel
を任意の位置までスクロールできると思いますが、ここで要件を達成するための簡単なトリックがあります。
public void ScrollToBottom(Panel p){
using (Control c = new Control() { Parent = p, Dock = DockStyle.Bottom })
{
p.ScrollControlIntoView(c);
c.Parent = null;
}
}
//use the code
ScrollToBottom(yourPanel);
または、便宜上拡張メソッドを使用します。
public static class PanelExtension {
public static void ScrollToBottom(this Panel p){
using (Control c = new Control() { Parent = p, Dock = DockStyle.Bottom })
{
p.ScrollControlIntoView(c);
c.Parent = null;
}
}
}
//Use the code
yourPanel.ScrollToBottom();
正確な位置を設定したい場合は、上記のコードを少し修正すると役立ちます。
//This can help you control the scrollbar with scrolling up and down.
//The position is a little special.
//Position for scrolling up should be negative.
//Position for scrolling down should be positive
public static class PanelExtension {
public static void ScrollDown(this Panel p, int pos)
{
//pos passed in should be positive
using (Control c = new Control() { Parent = p, Height = 1, Top = p.ClientSize.Height + pos })
{
p.ScrollControlIntoView(c);
}
}
public static void ScrollUp(this Panel p, int pos)
{
//pos passed in should be negative
using (Control c = new Control() { Parent = p, Height = 1, Top = pos})
{
p.ScrollControlIntoView(c);
}
}
}
//use the code, suppose you have 2 buttons, up and down to control the scrollbar instead of clicking directly on the scrollbar arrows.
int i = 0;
private void buttonUp_Click(object sender, EventArgs e)
{
if (i >= 0) i = -1;
yourPanel.ScrollUp(i--);
}
private void buttonDown_Click(object sender, EventArgs e)
{
if (i < 0) i = 0;
yourPanel.ScrollDown(i++);
}
使用する別の解決策は、Panel.VerticalScroll.Value
の使用です。ただし、期待どおりに機能させるには、さらに研究が必要だと思います。 Value
を一度変更すると表示されるため、スクロールバーの位置とコントロールの位置がうまく同期しません。 Panel.VerticalScroll.Value
はPanel.VerticalScroll.Minimum
とPanel.VerticalScroll.Maximum
の間にある必要があることに注意してください。
Panel
から派生するクラスがある場合は、次の2つの保護されたメソッドを呼び出してパネルをスクロールします。
// The bottom is off screen; scroll down. These coordinates must be negative or zero.
SetDisplayRectLocation(0, AutoScrollPosition.Y - item.BoundingRect.Bottom + ClientRectangle.Bottom);
AdjustFormScrollbars(true);
私の例では、item.BoundingRect.Bottom
はサムネイルの下部のY座標であり、サムネイル全体が表示されるようにパネルを下にスクロールする必要があります。
スクロールができるように一時的なコントロールを作成する@King Kingのソリューションは、私にとって「重い」ように思えました。 @Hans PassantによるAutoScrollMinSize
とAutoScrollPosition
の設定の提案は、私にとってはうまくいきませんでした。
AutoScroll
をデフォルト値の「true」のままにします。
これを試してください:-panel.ScrollControlIntoView(childcontrol);
これは動作するはずです。 childcontrolは、表示領域に表示する特定のコントロールです。
これは驚くほどうまくいきます!コード内のマイナス記号に注意してください。スクロール位置の設定には奇妙な動作があります。位置を正確な値(50)に設定すると、次回読むときにマイナス(-50)になります。したがって、新しいスクロール値を設定する前にそれを反転する必要があります。
下へスクロール:
private void ButtonScrollDown_OnClick(object sender, EventArgs e)
{
Point current = yourScrollPanel.AutoScrollPosition;
Point scrolled = new Point(current.X, -current.Y + 10);
yourScrollPanel.AutoScrollPosition = scrolled;
}
同様に上にスクロールします(-current.Y-10)
@King King Answered Codeを使用し、水平および垂直スクロールバーを非表示にする場合は、コンストラクターまたは初期化で次のコードを適用します。
yourPanel.AutoScroll = false;
yourPanel.HorizontalScroll.Maximum = 0;
yourPanel.HorizontalScroll.Visible = false;
yourPanel.VerticalScroll.Maximum = 0;
yourPanel.VerticalScroll.Visible = false;
yourPanel.AutoScroll = true;
パネルをトップにスクロールできない問題がありました。パネルに多くのコントロールを配置した後、パネルを一番上にスクロールして戻そうと、多くのことを試しました。
私がやったことには関係なく、常にVScrollバーを一番下に配置します。
徹底的なテストの結果、コントロールのTabStopプロパティがtrue(ユーザーコントロールのデフォルト)に設定されていたことが問題の原因であることがわかりました。
TabStopをfalseに設定すると修正されました。
可視領域のわずかに外側にあるコントロールを作成し(そのため、上部が-1でclientsize + 1)、ScrollControlIntoViewを呼び出します。
public static class PanelExtension {
public static void ScrollDown(this Panel p)
{
using (Control c = new Control() { Parent = p, Height = 1, Top = p.ClientSize.Height + 1 })
{
p.ScrollControlIntoView(c);
}
}
public static void ScrollUp(this Panel p )
{
using (Control c = new Control() { Parent = p, Height = 1, Top = -1})
{
p.ScrollControlIntoView(c);
}
}
}
//use the code, suppose you have 2 buttons, up and down to control the scrollbar instead of clicking directly on the scrollbar arrows.
private void buttonUp_Click(object sender, EventArgs e)
{
yourPanel.ScrollUp();
}
private void buttonDown_Click(object sender, EventArgs e)
{
yourPanel.ScrollDown();
}
yourpanel.SetAutoScrollMargin(1、1);非常に細かいスクロール手順を設定し、ボタンを押したときにタイマーを使ってスクロールを呼び出すことができます