Pergunta

Eu gostaria que o menu principal em meu aplicativo WPF para se comportar como o menu principal no IE8:

  • não é visível quando o aplicativo é iniciado
  • pressionar e soltar Alt torna visível
  • pressionar e soltar Alt novamente o torna invisível novamente
  • repeat até entediado

Como posso fazer isso? Tem que ser um código?

Adicionado em resposta às respostas apresentadas, porque eu ainda estou tendo problemas:

Meu Shell code-behind agora se parece com isso:

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); }
    }
}
Foi útil?

Solução

Você pode usar o evento PreviewKeyDown na janela. Para detectar a Alt chave que você terá que verificar a propriedade SystemKey do KeyEventArgs, ao contrário da propriedade chave que você usa normalmente para a maioria das outras chaves.

Você pode usar esse evento para definir um valor bool que foi declarada como um DependencyProperty no de trás de código do Windows.

propriedade Visibility do menu pode então ser ligado a essa propriedade usando o BooleanToVisibilityConverter.

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

Outras dicas

Eu tentaria olhando para manipular o evento PreviewKeyDown em sua janela. Eu não tenho certeza se pressionando Alt desencadeia este evento ou não, mas se isso acontecer, então eu alternar uma bool que é obrigado a visibilidade do menu principal da janela.

Se PreviewKeyDown não funcionar, eu não tenho certeza o que mais tentar. Você poderia olhar para obter as mensagens reais do Windows enviadas para a janela, mas isso pode ficar confuso muito rapidamente.

Seria melhor usar GetKeyboardState com VK_MENU para lidar com ambos esquerda e direita Alt , para imitar o comportamento do IE Windows Explorer / (Vista +) você vai precisar para controlar o elemento anteriormente focado para armazenamento de foco, em uma prensa VK_MENU enquanto o elemento focalizado está dentro do seu menu principal. Você também quer estar fazendo este trabalho em PreviewKeyUp (não para baixo).

Eu deparei com esse problema sozinho. Eu tentei ligar para o evento PreviewKeyDown, mas achei que fosse confiável. Em vez disso eu encontrei a classe InputManager onde você pode ligar para o EnterMenuMode a partir do código gerenciado. O gerente expõe dois eventos, para entrar e sair. O truque é não fechar o menu, mas defini-lo da altura do recipiente a zero quando é para ser escondido. Para mostrá-lo, simplesmente limpar o valor local e vai levar sua altura anterior.

Do meu controle do usuário 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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top