Как сделать WPF MenuBar видимым при нажатии клавиши ALT? - PullRequest
1 голос
/ 13 июля 2011

Сегодня я получил несколько новых ограничений для моего пользовательского интерфейса WPF, которые должны устранить постоянную видимость панели меню.

Я думал об имитации пользовательского интерфейса Windows Live Messenger. Это приложение отображает панель меню, только если нажата клавиша ALT. И снова скрывает, когда фокус на панели меню теряется.

В настоящее время я понятия не имею, как создать такую ​​вещь в WPF ... возможно ли что-то подобное?

Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 13 июля 2011

Вы можете записать событие нажатия клавиши в главном окне ..

KeyDown="Window_KeyDown"

и в коде файла ..

 private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.LeftAlt || e.Key == Key.RightAlt)
            {
                myMenu.Visibility = Visibility.Visible;
            }
        }

если вы хотите добиться этого с помощью MVVM или с помощью привязок ... вы можете использовать привязки клавиш ввода

 <Window.InputBindings>
        <KeyBinding Key="LeftAlt" Command="{Binding ShowMenuCommand}"/>
        <KeyBinding Key="RightAlt" Command="{Binding ShowMenuCommand}"/>
    </Window.InputBindings>
1 голос
/ 13 июля 2011

Я думаю, что правильная реализация с KeyUp.Это поведение IE8, Vista, Windows7 и других недавних продуктов MS:

private void MainWindow_KeyUp(Object sender, KeyEventArgs e)
    {
        if (e.Key == Key.System)
        {
            if (mainMenu.Visibility == Visibility.Collapsed)
                mainMenu.Visibility = Visibility.Visible;
            else
                mainMenu.Visibility = Visibility.Collapsed;
        }
    }
0 голосов
/ 13 июля 2011

Вы можете использовать KeyDown (или предварительную версию, если хотите), а затем проверить системный ключ следующим образом:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.KeyDown += new KeyEventHandler(MainWindow_KeyDown);
    }

    void MainWindow_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.System && (Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)
        {
            // ALT key pressed!
        }
    }
}
0 голосов
/ 13 июля 2011

Вот что я понял:

private void form_KeyDown(object sender, 
    System.Windows.Forms.KeyEventArgs e)
{
    if(e.KeyCode == Keys.Alt && /*menu is not displayed*/) 
    {
        // display menu
    } 
}

private void form_KeyUp(object sender,
    System.Windows.Forms.MouseEventArgs e)
{
    if (/*check if mouse is NOT over menu using e.X and e.Y*/)
    {
        // hide menu
    }
}

Если вам нужно что-то другое, поиграйте немного с клавиатурой и мышью.

...