8

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); }
    }
}
4

5 に答える 5

8

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

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

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

<Menu 
    Visibility={Binding Path=IsMenuVisibile, 
        RelativeSource={RelativeSource AncestorType=Window},
        Converter={StaticResource BooleanToVisibilityConverter}}
    />
于 2009-08-02T13:48:36.267 に答える
2

私は自分でこの問題に遭遇しました。イベントにフックしようとしPreviewKeyDownましたが、信頼できないことがわかりました。代わりに、マネージド コードからInputManagerフックできるクラスを見つけました。EnterMenuModemanager は、enter と exit の 2 つのイベントを公開します。秘訣は、メニューを折りたたまないことですが、非表示にする場合はコンテナーの高さをゼロに設定します。それを表示するには、ローカル値をクリアするだけで、以前の高さが使用されます。

私の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);
}
于 2011-05-18T09:22:57.700 に答える
1

PreviewKeyDownあなたのウィンドウでイベントを処理することを検討したいと思います。Alt を押すとこのイベントがトリガーされるかどうかはわかりませんが、トリガーされる場合boolは、ウィンドウのメイン メニューの表示にバインドされている a を切り替えます。

うまくいかない場合PreviewKeyDownは、他に何を試せばよいかわかりません。ウィンドウに送信された実際の Windows メッセージを調べることもできますが、すぐに混乱する可能性があります。

于 2009-08-02T12:45:48.397 に答える
1

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

于 2009-08-02T18:16:18.257 に答える