マウスホイールを使用してパネルをスクロールするにはどうすればよいですか?
-
05-07-2019 - |
質問
フォームにAutoScrollがtrueに設定されたパネルがあり、スクロールバーが自動的に表示されます。
ユーザーがマウスホイールを使用してパネルをスクロールできるようにするにはどうすればよいですか?どうもありがとう。
解決
パネルまたはパネル内のコントロールにフォーカスが必要です。フォーカスのあるコントロールにスクロールバーがある場合、パネルの代わりにスクロールすることに注意してください。
他のヒント
私のために働いたのは、 panel1_MouseEnter
EventHandlerを追加することでした:
private void panel1_MouseEnter(object sender, EventArgs e)
{
panel1.Focus();
}
次のコードは私のために働く.....
Public Form
{
InitializeComponent();
this.MouseWheel += new MouseEventHandler(Panel1_MouseWheel);
}
private void Panel1_MouseWheel(object sender, MouseEventArgs e)
{
panel1.Focus();
}
デザイナーファイルに、次のコード行を追加できます。 MouseWheelイベントは、[プロパティ]ウィンドウの[イベント]リストに表示されません。
this.Panel1.MouseWheel+= System.Windows.Forms.MouseEventHandler(this.Panel1_MouseWheel);
Panel1_MouseWheelは、マウスのウィールを回転させるとトリガーされます
.csファイルにコードを追加
パネルにフォーカスがあることを確認してください。そして、これはパネルのスクロールバーをスクロールする簡単なコードです。この助けを願っています。 :) ここにコードを入力してください
if(e.Delta > 0)
{
if (pnlContain.VerticalScroll.Value - 2 >= pnlContain.VerticalScroll.Minimum)
pnlContain.VerticalScroll.Value -= 2;
else
pnlContain.VerticalScroll.Value = pnlContain.VerticalScroll.Minimum;
}
else
{
if (pnlContain.VerticalScroll.Value + 2 <= pnlContain.VerticalScroll.Minimum)
pnlContain.VerticalScroll.Value += 2;
else
pnlContain.VerticalScroll.Value = pnlContain.VerticalScroll.Maximum;
}
私は、BorderStyleをnoneに設定したWindowsフォームを使用しています。パネルを使用してすべてのコントロールを配置しているため、見た目(色の違いなど)が同じ問題を抱えていました。正常に動作しました。
忘れていたのは:
public myForm()
{
InitializeComponent();
this.DoubleBuffered = true;
}
DoubleBufferedは魔法のようです。
スクロールホイールを動かすと、コントロールのMouseMoveイベントがトリガーされます。 MouseEventArgs引数には、Deltaという名前のプロパティがあります。これは、マウスホイールが移動したノッチの(符号付き)数を示します。このプロパティを使用して、パネルをスクロールできます。
Beam022が提供するソリューション(上記参照)は機能しましたが、他の多くのソリューションは機能しませんでした。私の場合、mousewheelイベントでDataGridViewコントロールをスクロールしようとしました。
DataGridView_MouseWheelイベントハンドラーが呼び出されていましたが、FirstDisplayedScrollingRowIndex値は変更されませんでした。明示的に1に設定した後でも、値は常に「0」でした。プロパティが読み取り専用であるかのようです。
.Net Framework 4.6にはまだ再現があります。
私の場合、パネルのクライアント領域全体がUserControlsで占められていました(スクロールバーを除き、内部領域の単一ピクセルは表示されていません)。
この場合、パネルはマウスイベントを取得せず、フォーカスを移動しません(スクロールバーをクリックしても「パネル内にいる」とは見なされません)。
UserControl派生クラスのコンストラクターに次の行を追加する必要がありました。
MouseEnter += delegate {
Parent?.Focus();
};
UserControlsにはスクロール可能なコンテンツがないので、今では正常に動作します。