2012-07-19 11 views
7

WPF mi permette di legare facilmente tasti di scelta rapida a livello di finestra per un metodo che utilizza la proprietà InputBindings. Qual è l'equivalente di questo in WinRT? Qual è il modo giusto per associare le scorciatoie da tastiera ai metodi in WinRT?qual è l'equivalente WinRT di InputBindings?

risposta

7

tasti funzione sono descritti here. Penso che tu voglia o access keys o accelerator keys.

Una chiave di accesso è una scorciatoia per un pezzo di interfaccia utente nella tua app. I tasti di accesso sono costituiti dal tasto Alt più un tasto lettera.

Un tasto di scelta rapida è una scorciatoia per un comando di app. La tua app potrebbe avere o meno un'interfaccia utente che corrisponde esattamente al comando. I tasti di scelta rapida sono costituiti dal tasto Ctrl più un tasto lettera.

L'esempio seguente illustra l'implementazione accessibile di tasti di scelta rapida per il gioco dei media, mettere in pausa e fermare i pulsanti:

<MediaElement x:Name="Movie" Source="sample.wmv" 
    AutoPlay="False" Width="320" Height="240"/> 

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> 

    <Button x:Name="Play" Margin="1,2" 
    ToolTipService.ToolTip="shortcut key: Ctrl+P" 
    AutomationProperties.AccessKey="Control P"> 
    <TextBlock><Underline>P</Underline>lay</TextBlock> 
    </Button> 

    <Button x:Name="Pause" Margin="1,2" 
    ToolTipService.ToolTip="shortcut key: Ctrl+A" 
    AutomationProperties.AccessKey="Control A"> 
    <TextBlock>P<Underline>a</Underline>use</TextBlock> 
    </Button> 

    <Button x:Name="Stop" Margin="1,2" 
    ToolTipService.ToolTip="shortcut key: Ctrl+S" 
    AutomationProperties.AccessKey="Control S"> 
    <TextBlock><Underline>S</Underline>top</TextBlock> 
    </Button> 

</StackPanel> 

<object AutomationProperties.AcceleratorKey="ALT+F" /> 

Important: Setting AutomationProperties.AcceleratorKey or AutomationProperties.AccessKey doesn't enable keyboard functionality. It only reports to the UI Automation framework what keys should be used, so that such information can be passed on to users via assistive technologies. The implementation for key handling still needs to be done in code, not XAML. You will still need to attach handlers for KeyDown or KeyUp events on the relevant control in order to actually implement the keyboard shortcut behavior in your app. Also, the underline text decoration for an access key is not provided automatically. You must explicitly underline the text for the specific key in your mnemonic as inline Underline formatting if you wish to show underlined text in the UI.

risposta di vedere @ Magiel per i dettagli di implementazione per il lato codice delle cose.

+0

E per quanto riguarda MouseBinding? Vedi la domanda StackOverflow http://stackoverflow.com/a/7354984. –

+0

@ Stefano.net Non sono sicuro di cosa intendi. Che dire del binding del mouse? – mydogisbox

+0

Collegamento di eventi del mouse tramite InputBinding (o equivalente) a oggetti che non vengono gestiti direttamente come un rettangolo, ad esempio. –

5

Importante !! Impostazione AutomationProperties.AcceleratorKey o AutomationProperties.AccessKey non abilita la funzionalità della tastiera. Riferisce solo al framework di automazione dell'interfaccia utente quali chiavi devono essere utilizzate, in modo che tali informazioni possano essere trasmesse agli utenti tramite tecnologie assistive. L'implementazione per la gestione delle chiavi deve ancora essere eseguita nel codice, non in XAML.

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    // Set the input focus to ensure that keyboard events are raised. 
    this.Loaded += delegate { this.Focus(FocusState.Programmatic); }; 
} 

private void Grid_KeyUp(object sender, KeyRoutedEventArgs e) 
{ 
    if (e.Key == VirtualKey.Control) isCtrlKeyPressed = false; 
} 

private void Grid_KeyDown(object sender, KeyRoutedEventArgs e) 
{ 
    if (e.Key == VirtualKey.Control) isCtrlKeyPressed = true; 
    else if (isCtrlKeyPressed) 
    { 
     switch (e.Key) 
     { 
      case VirtualKey.P: DemoMovie.Play(); break; 
      case VirtualKey.A: DemoMovie.Pause(); break; 
      case VirtualKey.S: DemoMovie.Stop(); break; 
     } 
    } 
}