と があるUserControl
がTreeView
ありTabControl
ます。このユーザー コントロールは、通常の形式でホストされています。
ユーザーがツリービューから何かを選択すると、カスタム ピクチャ ボックスがタブ コントロールのタブページに追加されます。このピクチャーボックスのキーを処理したいのですが、カスタムピクチャーボックス内で作成したイベントが呼び出されません。私が望むのは矢印キーを処理することですが、フォーカスはツリービューにとどまるため、矢印キーはツリービューで発生します。
ユーザーがクリックしたときにピクチャボックスにフォーカスを与えるようにコードを追加しましたが、ツリービューからフォーカスを削除するのには役立ちません。custompicturebox コントロールのコードの一部を次に示します。
更新
矢印キーのような特別なキーだけが機能していないようです。私の推測では、ツリービューによって矢印キーが登録されているためです。KeyDown
ピクチャーボックスのイベントを文字キーを使用するように変更すると、うまくいきます!
private void IcPackageViewBox_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Right)
{
OnPinClicked(_pinMap[_pinRectIndex].Pin);
if (_pinRectIndex < _pinMap.Count)
_pinRectIndex++;
else
_pinRectIndex = 0;
}
}
//Mouse Down Event
private void PackageViewBox_MouseDown(object sender, MouseEventArgs e)
{
Focus();
BringToFront(); //bring to front works! maybe it means focus should work also?
}
この UserControl をホストするフォームには、KeyPreview
設定True
がありますが、このフォームの他のイベントも設定する必要があります。たぶんこれが、カスタムコントロール内でキープレスを取得できない理由ですか?
private void MainForm_KeyDown(object sender, KeyEventArgs e)
{
if (e.Modifiers == Keys.Control)
{
projectBrowser.ControlKeyIsDown = true;
e.Handled = true;
}
}
private void MainForm_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.LControlKey || e.KeyCode == Keys.RControlKey || e.KeyCode == Keys.ControlKey || e.KeyCode == Keys.Control)
{
projectBrowser.ControlKeyIsDown = false;
e.Handled = true;
}
}
プログラムは次のようになります。