2013-07-09 15 views
6

Domanda: Come si esce dalla modalità di scelta rapida della tastiera dopo aver premuto e rilasciato il tasto Alt? In Office il ESC funziona, in WPF no.È necessario uscire dalla modalità di sottolineatura di Alt, possibilmente con il tasto ESC

Dettagli: Ho vari elementi Label in un'applicazione WPF.

<StackPanel> 
    <Label Grid.Column="0" VerticalAlignment="Center" Content="_Textbox 1" Target="textbox1" /> 
    <TextBox x:Name="textbox1" Width="50" /> 
    <Label Grid.Column="0" VerticalAlignment="Center" Content="T_extbox 2" Target="textbox2" /> 
    <TextBox x:Name="textbox2" Width="50" /> 
</StackPanel> 

Quando ho premere e rilasciare il tasto Alt le P soggiorni sottolineato e posso quindi premere il tasto separatamente P e che etichetta prende la sua azione. Questo è lo stesso di come funzionano Word 2013 e Blocco note in quanto non è necessario premere il Alt e lo P allo stesso tempo.

Dove il WPF è diverso non è possibile premere il tasto ESC per interrompere la sottolineatura e interrompere la navigazione automatica ai comandi Label. L'unico modo che vedo per uscire dalla modalità di navigazione della tastiera è usare il mouse e fare clic da qualche parte, sconfiggendo l'obiettivo della navigazione da tastiera.

+3

In realtà c'è una leggera differenza nel comportamento di Blocco note e Word 2013. Il controllo è lì con l'hot-key in un 'Menu' che prende Focus non appena si preme Alt e si può vedere che ottengono la messa a fuoco perché il punto di omissione dell'area di testo scompare e' Esc' restituisce lo stato attivo al 'TextBox' mentre cancellare il "_". Ora nel codice di esempio se si inseriscono i due 'Label' o uno all'interno di un'

'e quindi si preme Alt, si ottiene lo stesso comportamento di Word o Blocco note. Senza il Menu non c'è controllo che voglia prendere il focus intermedio. – Viv

risposta

0

Aggiunta al mio commento originale

In realtà c'è una leggera differenza in Blocco note e Word 2013 comportamento. Il controllo è lì con il tasto di scelta rapida in un menu che prende la messa a fuoco non appena si preme Alt e si può vedere che ottengono la messa a fuoco perché il punto di omissione dell'area di testo scompare e Esc quindi restituisce lo stato attivo alla casella di testo durante la cancellazione di "_". Ora nel codice di esempio se inserisci le due etichette o anche una all'interno di una e poi premi Alt, ottieni lo stesso comportamento di Word o Blocco note. Senza il Menu non c'è controllo che voglia prendere il focus intermedio.

Questo sembra che sia un problema in cui il Menu ottiene un focus differita per gestire questi tasti di scelta rapida in un suo FocusManager.IsFocusScope.

Un altro frammento dal MSDN:

Lo scenario seguente illustra come la tastiera di messa a fuoco e il cambiamento attivo logico in un'applicazione Windows Presentation Foundation (WPF) che ha una finestra con un TextBox e un menu che ha un MenuItem. Quando lo stato attivo della tastiera cambia da TextBox a MenuItem, TextBox perde la messa a fuoco della tastiera ma mantiene la messa a fuoco logica per l'ambito di messa a fuoco della finestra. MenuItem ottiene lo stato attivo della tastiera e ottiene la messa a fuoco logica per l'ambito di messa a fuoco del menu. Quando il focus della tastiera ritorna alla finestra di root, l'elemento in Focus field di Windows con focus logico otterrà il focus della tastiera, che in questo caso è il TextBox. Il TextBox ora ha il focus sulla tastiera e il focus logico. MenuItem perde la messa a fuoco della tastiera, ma mantiene la messa a fuoco logica per l'ambito di messa a fuoco del menu.

Soluzione:

Se proprio non può stare il fatto che siete limitati con l'esigenza di raggruppamento imposto dalla Menu per ottenere la funzionalità hot-key, si potrebbe fare qualcosa di simile:

<Grid Margin="25"> 
    <Grid.RowDefinitions> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="15" /> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="*" /> 
    <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="Auto" /> 
    <ColumnDefinition Width="*" /> 
    <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <!-- cannot use Visibility="Collapsed" or "Hidden" on the Menu to make it take focus on Alt press --> 
    <Menu Width="0" 
     Height="0"> 
    <Label x:Name="label1" 
      Content="_Textbox 1" 
      Target="{Binding ElementName=textbox1}" /> 
    <Label x:Name="label2" 
      Content="T_extbox 2" 
      Target="{Binding ElementName=textbox2}" /> 
    <Label x:Name="label3" 
      Content="Another Loose Label to Link Text_Box 1" 
      Target="{Binding ElementName=textbox1}" /> 
    </Menu> 
    <Label Grid.Row="0" 
      Grid.Column="0" 
      Content="{Binding ElementName=label1, 
          Path=Content}" /> 
    <TextBox x:Name="textbox1" 
      Grid.Row="0" 
      Grid.Column="1" 
      Grid.ColumnSpan="2" 
      Margin="15 0 0 0" 
      VerticalAlignment="Center" /> 
    <Label Grid.Row="2" 
      Grid.Column="0" 
      Content="{Binding ElementName=label2, 
          Path=Content}" /> 
    <TextBox x:Name="textbox2" 
      Grid.Row="2" 
      Grid.Column="1" 
      Grid.ColumnSpan="2" 
      Margin="15 0 0 0" 
      VerticalAlignment="Center" /> 
    <Rectangle Grid.Row="3" 
       Grid.RowSpan="2" 
       Grid.Column="1" 
       Margin="10" 
       Fill="Tomato" /> 
    <Label Grid.Row="4" 
      Grid.Column="2" 
      Content="{Binding ElementName=label3, 
          Path=Content}" /> 
</Grid> 

Quindi, in questa configurazione non usiamo alcun personalizzato Style 's per qualsiasi del controllo del.Abbiamo praticamente Creiamo un nuovo livello superiore Menu e aggiungere tutti gli hot-key Label desiderati 's ad esso e impostiamo è larghezza e l'altezza a 0.

Così nel reale di layout Visibile Grid possiamo posizionare le visibili Label' s ovunque scegliamo e per evitare la duplicazione del codice nello specificare il Label.Content due volte per ogni Label (una volta nel menu e il prossimo nel layout reale) utilizziamo un collegamento per ottenere il contenuto per l'etichetta visiva dalla sua etichetta corrispondente nel menu.

Aggiornamento

Rispondi al commento di OP:

io non sono sicuro che questo sarà pratico nella mia applicazione. Ho hotkey su tutta l'app con alcuni duplicati a schermo. Non sarebbe possibile implementare questo tipo di soluzione alternativa.

Beh, non vedo come i duplicati o le cose in giro facciano differenza per questo tbh.

  • Se si dispone di hot-chiave duplicata multipla Window 's, quindi definire Content per questi articolo duplicato è come una risorsa String in XAML o il vostro resx è possibile fare riferimento ad esso ovunque ne avete bisogno.
  • Mantenibile - Bene, non si dispone di nulla di speciale per la manutenibilità. Il tuo layout non è influenzato, il tuo non è limitato a nulla. Se qualcosa si ottiene uno <Menu> seduto nascosto al livello superiore di ciascuno dei tuoi Window che definisce i tasti di scelta rapida per quello Window e all'interno di quella finestra qualsiasi controllo che desidera tale funzionalità Lega alla voce figlio Menu corrispondente. Penso che unifichi l'ambito delle hot-keys in un Window in un singolo posto piuttosto che in più posti diversi.

Infine, non sto cercando di imporre questo approccio a te, si riduce alle tue preferenze personali. Se ti senti a disagio con ciò, potresti ottenere la sottoclasse del tuo Label e implementare la funzionalità del fuoco posticipato o sollevare un bug Microsoft per vedere se possono forse indirizzarlo per te o trovare una soluzione alternativa o lasciar andare il caldo -key funzionalità tutto-insieme.

+0

Sei decisamente su qualcosa qui. Il glitch con questo codice è la scorciatoia da tastiera funziona solo per la prima etichetta definita in XAML. Se si inverte l'ordine delle etichette, la seconda scorciatoia inizia a funzionare. Grande sforzo su questo! –

+0

@KevinKalitowski oh yh Ho davvero perso quel pezzetto. Il problema è che quando Alt viene premuto il primo 'Menu' dichiarato ottiene un focus differito e quindi solo i tasti di scelta rapida in risposta ai bambini di' Menu'. Nello Style originale ogni 'Label' è stato avvolto in un singolo' Menu', causando quindi il problema in cui solo uno degli HotKey funzionava in base all'etichetta che era stata dichiarata per prima. Ho modificato lo stile da applicare al menu anziché a Label, rendendo quindi obbligatorio aggiungere tutti i 'Label' come figli su ** uno **' Menu' per consentire a entrambi i tasti di scelta rapida di funzionare. Aggiornato la mia risposta e sembra funzionare bene. – Viv

+0

@KevinKalitowski Ho anche aggiunto un approccio alternativo in cui possiamo saltare la definizione di qualsiasi 'Stile' personalizzato e utilizzare un Menu separato praticamente come un Contenitore per tutti i tasti di scelta rapida. Questo approccio risolve il problema richiedendo a tutti gli hot-key Label di risiedere nello stesso menu in quanto abbiamo una gestione menu separata che ha tenuto nascosto il codice visivo permettendo all'interfaccia utente di essere disposta con tutta la libertà di cui hai bisogno. – Viv

Problemi correlati