2014-04-18 14 views
7

Qualcuno può spiegare il significato di manipulation modes come TranslateX, TranslateRailsX, TranslateInertia? Che cos'è un rail mode? E di quale inerzia stanno parlando?ManipulationMode spiegato

+1

Penso che l'API sia solo in WinRT/XAML e non in WPF, quindi ho rimosso il tag WPF dalla domanda e aggiunto il runtime di Windows uno per chiarezza. –

risposta

8

Con rotaie - quando il processore di input rileva se la manipolazione è prevalentemente verticale o prevalentemente orizzontale, si attacca al rispettivo asse quando si riportano valori delta/cumulativi di traslazione. Altrimenti, consente semplicemente di manipolare liberamente qualsiasi cosa tu stia manipolando. I flag delle rotaie devono essere usati in combinazione con i flag non-rail, quindi solo TranslateRailsX non funziona. Hai bisogno di entrambi e TranslateX per ottenere qualcosa.

Il flag TranslateInertia consente di gestire facilmente i flicker o le rotazioni/le scale inerziali in caso di altri flag di inerzia. Fondamentalmente se aggiungi questo flag allo TranslateX per esempio e fai un gesto rapido, continuerai a ricevere gli eventi di input (ManipulationDelta) per un po 'anche dopo che il gesto è stato completato. Si ottiene anche l'evento ManipulationInertiaStarting quando si sfiora una volta terminato il flusso di input, in modo da poter controllare fino a che punto il colpo va se lo si desidera. È possibile controllare my extensions sull'argomento di quell'evento in WinRT XAML Toolkit per ottenere un maggiore controllo sulla balistica del colpo.

tuo ManipulationDeltaEventArgs avere una proprietà IsIntertial si può anche utilizzare per controllare se gli eventi che si stanno ottenendo sono direttamente da eventi di input o il risultato di un film e anche chiamare Complete() se per qualche motivo non si vuole continuare a ricevere la eventi delta per il film.

+0

Se avete bisogno sia di TranslateRailsX che di TranslateX, come mai il msdn doc dice: "Non combinare i valori di Translate * con i valori di TranslateRails *, questi sono trattati come valori mutuamente esclusivi"? https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.uielement.manipulationmode – user362178

0

Ecco un semplice esempio che mostra come ho implementato TranslateRailsX/Y.

Volevo che si registrasse solo lo scorrimento orizzontale ma usando solo TranslateX/Y si stava sollevando verso sinistra o verso destra anche se stavo scorrendo verso l'alto o verso il basso.

Quindi, solo un semplice XAML e, come nel mio caso, desidero solo i salti orizzontali, non i salti verticali.

file XAML:

<Grid Background="WhiteSmoke"> 
    <WebView Name="webview" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
</Grid> 

xaml.cs di file:

int x1; 
    int x2; 
    int y1; 
    int y2; 
public MainPage() 
    { 
     this.InitializeComponent(); 
     webview.ManipulationMode = ManipulationModes.TranslateRailsX | ManipulationModes.TranslateRailsY; 
     webview.ManipulationStarted += (s, e) => x1 = (int)e.Position.X; 
     webview.ManipulationStarted += (s, e) => y1 = (int)e.Position.Y; 

     webview.ManipulationCompleted += (s, e) => 
     { 
      x2 = (int)e.Position.X; 
      y2 = (int)e.Position.Y; 

      System.Diagnostics.Debug.WriteLine(x1); 
      System.Diagnostics.Debug.WriteLine(x2); 
      System.Diagnostics.Debug.WriteLine(y1); 
      System.Diagnostics.Debug.WriteLine(y2); 

      if (x1 > x2) 
      { 
       System.Diagnostics.Debug.WriteLine("right"); 
      }; 
      if (x1 < x2) 
      { 
       System.Diagnostics.Debug.WriteLine("left"); 

      } 

     }; 

E ora ottengo il seguente su un colpo verticale

x1 180 
x2 180 
y1 201 
y2 386 

e scorrere orizzontale

x1 89 
x2 293 
y1 371 
y2 371 
left or right 

Spero che questo aiuti qualcuno nella stessa situazione.

Problemi correlati