WPFのAltキーを使用してメインメニューの表示を切り替えるにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1218394

質問

WPFアプリのメインメニューをIE8のメインメニューのように動作させたい:

  • アプリの起動時には表示されません
  • Altキーを押して放すと表示されます
  • Altをもう一度押して放すと、再び非表示になります
  • 退屈するまで繰り返す

これを行うにはどうすればよいですか?コードにする必要がありますか?

まだ問題が発生しているため、提出された回答への応答として追加:

私のシェルコードビハインドは次のようになります。

public partial class Shell : Window
{
    public static readonly DependencyProperty IsMainMenuVisibleProperty;

    static Shell()
    {
        FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
        metadata.DefaultValue = false;

        IsMainMenuVisibleProperty = DependencyProperty.Register(
            "IsMainMenuVisible", typeof(bool), typeof(Shell), metadata);
    }

    public Shell()
    {
        InitializeComponent();

        this.PreviewKeyUp += new KeyEventHandler(Shell_PreviewKeyUp);
    }

    void Shell_PreviewKeyUp(object sender, KeyEventArgs e)
    {
        if (e.SystemKey == Key.LeftAlt || e.SystemKey == Key.RightAlt)
        {
            if (IsMainMenuVisible == true)
                IsMainMenuVisible = false;
            else
                IsMainMenuVisible = true;
        }
    }

    public bool IsMainMenuVisible
    {
        get { return (bool)GetValue(IsMainMenuVisibleProperty); }
        set { SetValue(IsMainMenuVisibleProperty, value); }
    }
}
役に立ちましたか?

解決

ウィンドウで PreviewKeyDown イベントを使用できます。 Alt キーを検出するには、ほとんどの場合に通常使用するKeyプロパティではなく、 KeyEventArgs SystemKey プロパティを確認する必要があります。他のキー。

このイベントを使用して、Windowsコードビハインドで DependencyProperty として宣言されている bool 値を設定できます。

メニューの Visibility プロパティは、 BooleanToVisibilityConverter を使用してこのプロパティにバインドできます。

<Menu 
    Visibility={Binding Path=IsMenuVisibile, 
        RelativeSource={RelativeSource AncestorType=Window},
        Converter={StaticResource BooleanToVisibilityConverter}}
    />

他のヒント

ウィンドウの PreviewKeyDown イベントの処理を検討してみます。 Altを押してこのイベントがトリガーされるかどうかはわかりませんが、トリガーされる場合は、ウィンドウのメインメニューの可視性にバインドされている bool を切り替えます。 >

PreviewKeyDown が機能しない場合、他に何を試すべきかわかりません。ウィンドウに送信される実際のWindowsメッセージを確認することもできますが、非常に迅速に面倒になる可能性があります。

GetKeyboardStateを使用することをお勧めします VK_MENU で左右の Alt の両方を処理し、IE / Windows Explorer(Vista +)の動作を模倣して、追跡する必要があります VK_MENU を押しながらフォーカスを保存する以前にフォーカスされた要素。フォーカスされた要素はメインメニュー内にあります。また、この作業を PreviewKeyUp (ダウンではなく)で行いたいと考えています。

自分でこの問題に出くわしました。 PreviewKeyDown イベントにフックしようとしましたが、信頼できないことがわかりました。代わりに、マネージコードから EnterMenuMode にフックできる InputManager クラスを見つけました。マネージャーは、入力と終了の2つのイベントを公開します。秘Theは、メニューを折りたたむのではなく、非表示にするときにコンテナーの高さをゼロに設定することです。表示するには、単にローカル値をクリアすると、以前の高さが必要になります。

TopMenu ユーザーコントロールから:

public TopMenu()
{
    InitializeComponent();
    InputManager.Current.EnterMenuMode += OnEnterMenuMode;
    InputManager.Current.LeaveMenuMode += OnLeaveMenuMode;
    Height = 0;
}

private void OnLeaveMenuMode(object sender, System.EventArgs e)
{
    Height = 0;
}

private void OnEnterMenuMode(object sender, System.EventArgs e)
{
    ClearValue(HeightProperty);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top