WPF - Multi Touch
Windows 7 e le sue versioni successive hanno la capacità di ricevere input da più dispositivi sensibili al tocco. Le applicazioni WPF possono anche gestire l'input tocco come altro input, ad esempio il mouse o la tastiera, generando eventi quando si verifica un tocco.
WPF espone due tipi di eventi quando si verifica un tocco: touch events e manipulation events. Gli eventi touch forniscono dati grezzi su ogni dito su un touchscreen e sul suo movimento. Gli eventi di manipolazione interpretano l'input come determinate azioni. Entrambi i tipi di eventi vengono discussi in questa sezione.
I seguenti componenti sono necessari per sviluppare un'applicazione in grado di rispondere al tocco.
- Microsoft Visual Studio 2010 o versioni successive.
- Windows 7 o versione successiva.
- Un dispositivo, come un touchscreen, che supporta Windows Touch.
I seguenti termini sono comunemente usati quando si discute dell'input tattile:
Touch- Tipo di input dell'utente che può essere riconosciuto in Windows 7 o versioni successive. L'input tattile viene avviato da uno schermo sensibile al tocco.
Multi Touch- Tipo di ingresso che avviene da più punti contemporaneamente. In WPF, quando si parla di tocco, di solito significa multi-touch.
Manipulation- Si verifica quando il tocco viene dedotto come azione fisica applicata a un oggetto. In WPF, gli eventi di manipolazione interpretano l'input come una manipolazione di traslazione, espansione o rotazione.
Touch Device - Rappresenta un dispositivo che produce input tattile, come un singolo dito su un touchscreen.
Esempio
Per comprendere tutti questi concetti, creiamo un nuovo progetto WPF con il nome WPFTouchInput.
Trascina un rettangolo da una casella degli strumenti alla finestra di progettazione e riempi il rettangolo con un'immagine o qualsiasi colore. Se vuoi usare un'immagine, non dimenticare di includere l'immagine nella tua soluzione, altrimenti il programma non verrà eseguito.
Il codice XAML seguente inizializza un rettangolo con proprietà ed eventi diversi.
<Window x:Class = "WPFMultiTouchInput.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local = "clr-namespace:WPFMultiTouchInput"
mc:Ignorable = "d" Title = "MainWindow" Height = "350" Width = "604">
<Window.Resources>
<MatrixTransform x:Key = "InitialMatrixTransform">
<MatrixTransform.Matrix>
<Matrix OffsetX = "200" OffsetY = "200"/>
</MatrixTransform.Matrix>
</MatrixTransform>
</Window.Resources>
<Canvas>
<Rectangle Name = "manRect" Width = "321" Height = "241"
RenderTransform = "{StaticResource InitialMatrixTransform}"
IsManipulationEnabled = "true" Canvas.Left = "-70" Canvas.Top = "-170">
<Rectangle.Fill>
<ImageBrush ImageSource = "Images/DSC_0076.JPG"/>
</Rectangle.Fill>
</Rectangle>
</Canvas>
</Window>
Ecco l'implementazione per diversi eventi di manipolazione:
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;
namespace WPFMultiTouchInput {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
void Window_ManipulationStarting(object sender, ManipulationStartingEventArgs e) {
e.ManipulationContainer = this;
e.Handled = true;
}
void Window_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) {
Rectangle rectToMove = e.OriginalSource as Rectangle;
Matrix rectsMatrix = ((MatrixTransform)rectToMove.RenderTransform).Matrix;
rectsMatrix.RotateAt(e.DeltaManipulation.Rotation, e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
rectsMatrix.ScaleAt(e.DeltaManipulation.Scale.X, e.DeltaManipulation.Scale.X,
e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
rectsMatrix.Translate(e.DeltaManipulation.Translation.X,
e.DeltaManipulation.Translation.Y);
rectToMove.RenderTransform = new MatrixTransform(rectsMatrix);
Rect containingRect = new Rect(((FrameworkElement)e.ManipulationContainer).RenderSize);
Rect shapeBounds = rectToMove.RenderTransform.TransformBounds(new Rect(rectToMove.RenderSize));
if (e.IsInertial && !containingRect.Contains(shapeBounds)) {
e.Complete();
}
e.Handled = true;
}
void Window_InertiaStarting(object sender, ManipulationInertiaStartingEventArgs e) {
e.TranslationBehavior.DesiredDeceleration = 10.0 * 96.0 / (1000.0 * 1000.0);
e.ExpansionBehavior.DesiredDeceleration = 0.1 * 96 / (1000.0 * 1000.0);
e.RotationBehavior.DesiredDeceleration = 720 / (1000.0 * 1000.0);
e.Handled = true;
}
}
}
Quando compili ed esegui il codice precedente, verrà prodotto il seguente widnow.
Ora puoi ruotare, ingrandire, rimpicciolire questa immagine con il dito sul touch screen.