7

ツールバーを持つWPFアプリケーションがあります。ツールバーには、ツールとしていくつかのユーザー コントロールがあります。

各コントロールにアクセス キーを設定しましたが、正常に動作しています。

問題は次のとおりです:ユーザーコントロール(ボタンとラベルで構成され、ボタンのアクセスキーを設定しました)をクリックすると、指定されたタスクが完了しますが、「Alt」キーを押さずにアクセスキーを押すと、取得されます選択されました。

何か案は?

4

3 に答える 3

0

他の回答で述べたように、設定によりIsAltKeyRequiredInAccessKeyDefaultScope、キーを押さずにアクセスキーのアクションを呼び出すことを回避できますAlt。ただし、これにより、Enterキー (デフォルト アクションを呼び出すため) およびEscキー (キャンセル アクションを呼び出すため) が無効になる場合もあります。

代わりに提案された回避策を使用し、 および をテストすることKey.EnterKey.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;
}
于 2015-10-12T14:11:40.970 に答える