2

私は、ウィンドウのフルサイズの TabControl と、タブ内のその他のものを使用して、「タブ ブラウジング」メタファを使用するアプリを作成しています。場合によっては、これらのタブ自体に他の TabControls が含まれることがあります。

(タブ内のタブは混乱を招く可能性があるため、内部の TabControl のスタイルを変更して、TabControl のように見えないようにします。おそらく、タブの代わりに上部で ToggleButtons を使用するようにスタイルを設定します。)

この UI は、タブ ブラウジングのメタファーが機能することを期待するように動作する必要がありますCtrl。 t は TabControl のように見えるため、 +Tabに応答することは想定されていません)。ただし、もちろん、内側の TabControl が最初にキー イベントを取得し、それ自体を処理します。CtrlTab

内側の TabControl がCtrl+TabおよびCtrl+ Shift+Tabキー イベントに応答しないようにして、これらのイベントが外側の TabControl にバブル アップできるようにする最善の方法は何ですか?

4

3 に答える 3

1

ここで提案されているようにカスタム コントロールを作成する代わりに、「アタッチされた動作」を作成してこれをカプセル化することができます。

namespace WpfApplication1
{
  using System.Windows;
  using System.Windows.Input;

  public static class IgnoreCtrlTabBehaviour
  {
    //Setter for use in XAML: this "enables" this behaviour
    public static void SetEnabled(DependencyObject depObj, bool value)
    {
      depObj.SetValue(EnabledProperty, value);
    }

    public static readonly DependencyProperty EnabledProperty =
        DependencyProperty.RegisterAttached("Enabled", typeof(bool), 
        typeof(IgnoreCtrlTabBehaviour), 
        new FrameworkPropertyMetadata(false, OnEnabledSet));

    static void OnEnabledSet(DependencyObject depObj, DependencyPropertyChangedEventArgs args)
    {
      var uiElement = depObj as UIElement;
      uiElement.PreviewKeyDown += 
        (object _, System.Windows.Input.KeyEventArgs e) => 
        {
          if (e.Key == Key.Tab && 
              (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
          {
            e.Handled = true;
          }
        };
      }
    }
  }

次のように XAML で使用します。

<Window x:Class="WpfApplication1.MainWindow"
    ...
    xmlns:local="clr-namespace:WpfApplication1"

...
<TabControl local:IgnoreCtrlTabBehaviour.Enabled="True">
  <TabItem Header="tab1">
...
于 2012-12-18T16:18:16.670 に答える