WPFのAltキーを使用してメインメニューの表示を切り替えるにはどうすればよいですか?
-
10-07-2019 - |
質問
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);
}