ツールバーを持つWPFアプリケーションがあります。ツールバーには、ツールとしていくつかのユーザー コントロールがあります。
各コントロールにアクセス キーを設定しましたが、正常に動作しています。
問題は次のとおりです:ユーザーコントロール(ボタンとラベルで構成され、ボタンのアクセスキーを設定しました)をクリックすると、指定されたタスクが完了しますが、「Alt」キーを押さずにアクセスキーを押すと、取得されます選択されました。
何か案は?
ツールバーを持つWPFアプリケーションがあります。ツールバーには、ツールとしていくつかのユーザー コントロールがあります。
各コントロールにアクセス キーを設定しましたが、正常に動作しています。
問題は次のとおりです:ユーザーコントロール(ボタンとラベルで構成され、ボタンのアクセスキーを設定しました)をクリックすると、指定されたタスクが完了しますが、「Alt」キーを押さずにアクセスキーを押すと、取得されます選択されました。
何か案は?
他の回答で述べたように、設定によりIsAltKeyRequiredInAccessKeyDefaultScope
、キーを押さずにアクセスキーのアクションを呼び出すことを回避できますAlt。ただし、これにより、Enterキー (デフォルト アクションを呼び出すため) およびEscキー (キャンセル アクションを呼び出すため) が無効になる場合もあります。
代わりに提案された回避策を使用し、 および をテストすることKey.Enter
でKey.Escape
、この問題を回避できます。ただし、キーを押さないとアクセス キーでメニュー項目を選択できない場合がありAltます。これは、スコープ内のボタンが同じアクセス キーを使用している場合に問題になる可能性があります。
代わりに、潜在的に呼び出し可能なAccessText
コントロールが a 内にあるかどうかを確認することで、アクセス キー イベントを処理することができますMenuItem
。
EventManager.RegisterClassHandler(
typeof(UIElement),
AccessKeyManager.AccessKeyPressedEvent,
new AccessKeyPressedEventHandler(OnAccessKeyPressed));
...
static void OnAccessKeyPressed(object accessKeyTarget, AccessKeyPressedEventArgs e)
{
if (!e.Handled && e.Scope == null &&
(Keyboard.Modifiers & ModifierKeys.Alt) != ModifierKeys.Alt &&
!ShouldElementHandleAccessKeysWhenAltIsNotPressed(accessKeyTarget as UIElement))
{
e.Target = null;
e.Handled = true;
}
}
static bool ShouldElementHandleAccessKeysWhenAltIsNotPressed(UIElement element)
{
if (element == null) return false;
var accessText = element as AccessText;
if (accessText != null && !IsDecendantOfMenuItem(accessText)) return false;
return true;
}
static bool IsDecendantOfMenuItem(DependencyObject element)
{
for (; element != null; element = VisualTreeHelper.GetParent(element))
if (element is MenuItem) return true;
return false;
}