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.
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