This article describes the various input pointer events that can be helpful when designing Windows Store Apps using XAML.
In my previous article I showed two events of Pointer input; MouseHover and MouseExit. You can see that from here.
But now I will show another 4 types of pointer input events that Windows Store apps support; they are:
- PointerPressed: It occurs when the pointer is pressed on the screen.
- PointerMoved: It occurs when the pointer is moving around the screen.
- PointerReleased: It occurs when the pointer button is released after being pressed.
- PointerExisted: It works the same as PointerReleased but maybe in another condition too.
So, here I will create an application using these pointer events.
Procedure to be followed.
Step 1
Create a Blank Windows Store App using C#.
Step 2
Here I create some XAML markup code for the UI design; it is:
<Page
    x:Class="drawingapp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:drawingapp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
 
    <Grid >
        <Grid.Background>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="Black"/>
                <GradientStop Color="#FFCD7070" Offset="1"/>
            </LinearGradientBrush>
        </Grid.Background>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>       
        <Grid x:Name="Output" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="30,30,0,0" Grid.Row="1">
            <StackPanel ManipulationMode="All">
                <Canvas x:Name="DrawingArea" Background="White" Height="500" Width="900"/>
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,10">
                    <Button x:Name="Erase" Content="Erase" Margin="0,0,10,0"  Click="Erase_Click_1"/>
                    <Button x:Name="Draw" Content="Draw" Margin="0,0,10,0" Click="Draw_Click_1"/>
                    <Button x:Name="Reset" Content="Reset" Margin="0,0,10,0"  Click="Reset_Click_1"/>                   
                </StackPanel>                
            </StackPanel>
        </Grid>
    </Grid>
</Page>
Step 3
Here is the code of code-behind file.
Declare the 4 events of the input pointer at the initialization point. See:
 
DrawingArea.PointerPressed += new PointerEventHandler(DrawingArea_PointerPressed);
DrawingArea.PointerMoved += new PointerEventHandler(DrawingArea_PointerMoved);
DrawingArea.PointerReleased += new PointerEventHandler(DrawingArea_PointerReleased);
DrawingArea.PointerExited += new PointerEventHandler(DrawingArea_PointerReleased);
Code of PointerPressed Event:
void DrawingArea_PointerPressed(object sender, PointerRoutedEventArgs e)
{
    Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(DrawingArea);
    contacts[pt.PointerId] = pt.Position;
    e.Handled = true;
    ++ActiveContacts;
}
The above code gets the current pointer position.
Code of PointerRelease Event.
void DrawingArea_PointerReleased(object sender, PointerRoutedEventArgs e)
{
    uint ptrId = e.GetCurrentPoint(sender as FrameworkElement).PointerId;
    if (contacts.ContainsKey(ptrId))
    {
        contacts[ptrId] = null;
        contacts.Remove(ptrId);
        --ActiveContacts;
    }
   e.Handled = true;
}
Code of PointerMoved Event.
void DrawingArea_PointerMoved(object sender, PointerRoutedEventArgs e)
{
   if (i == 0)
    {
       Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(DrawingArea);
       uint ptrId = pt.PointerId;
       if (contacts.ContainsKey(ptrId) && contacts[ptrId].HasValue)
       {
          Point currentContact = pt.Position;
          Point previousContact = contacts[ptrId].Value;
          if (Distance(currentContact, previousContact) > 4)
          {
             Line l = new Line()
             {
                 X1 = previousContact.X,
                 Y1 = previousContact.Y,
                 X2 = currentContact.X,
                 Y2 = currentContact.Y,
                 StrokeThickness = THICKNESS,
                 Stroke = new SolidColorBrush(Colors.Green),
                 StrokeEndLineCap = PenLineCap.Round
             };
          contacts[ptrId] = currentContact;
          ((System.Collections.Generic.IList<UIElement>)DrawingArea.Children).Add(l);
         }
       }
    }
    else
    {
       Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(DrawingArea);
       uint ptrId = pt.PointerId;
       if (contacts.ContainsKey(ptrId) && contacts[ptrId].HasValue)
       {
           Point currentContact = pt.Position;
           Point previousContact = contacts[ptrId].Value;
           if (Distance(currentContact, previousContact) > 4)
           {
              Line l = new Line()
             {
               X1 = previousContact.X,
               Y1 = previousContact.Y,
               X2 = currentContact.X,
               Y2 = currentContact.Y,
               StrokeThickness = THICKNESS + 12,
               Stroke = new SolidColorBrush(Colors.White),
               StrokeEndLineCap = PenLineCap.Round
              };
              contacts[ptrId] = currentContact;
             ((System.Collections.Generic.IList<UIElement>)DrawingArea.Children).Add(l);
           }
        }
    }
    e.Handled = true;
}
Step 4
The complete code of the MainPage.cs file:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.UI.Xaml.Shapes;
 
namespace drawingapp
{
    public sealed partial class MainPage : Page
    {
        const uint CONTACTS = 10;
        const double THICKNESS = 5;
        uint ActiveContacts;
        Dictionary<uint, Point?> contacts;
 
        public MainPage()
        {
            this.InitializeComponent();
            ActiveContacts = 0;
            contacts = new Dictionary<uint, Point?>((int)CONTACTS);
            DrawingArea.PointerPressed += new PointerEventHandler(DrawingArea_PointerPressed);
            DrawingArea.PointerMoved += new PointerEventHandler(DrawingArea_PointerMoved);
            DrawingArea.PointerReleased += new PointerEventHandler(DrawingArea_PointerReleased);
            DrawingArea.PointerExited += new PointerEventHandler(DrawingArea_PointerReleased);
        }
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }
        void DrawingArea_PointerReleased(object sender, PointerRoutedEventArgs e)
        {
            uint ptrId = e.GetCurrentPoint(sender as FrameworkElement).PointerId;
            if (contacts.ContainsKey(ptrId))
            {
                contacts[ptrId] = null;
                contacts.Remove(ptrId);
                --ActiveContacts;
            }
            e.Handled = true;
        }
        void DrawingArea_PointerMoved(object sender, PointerRoutedEventArgs e)
        {
            if (i == 0)
            {
                Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(DrawingArea);
                uint ptrId = pt.PointerId;
                if (contacts.ContainsKey(ptrId) && contacts[ptrId].HasValue)
                {
                    Point currentContact = pt.Position;
                    Point previousContact = contacts[ptrId].Value;
                    if (Distance(currentContact, previousContact) > 4)
                    {
                        Line l = new Line()
                        {
                            X1 = previousContact.X,
                            Y1 = previousContact.Y,
                            X2 = currentContact.X,
                            Y2 = currentContact.Y,
                            StrokeThickness = THICKNESS,
                            Stroke = new SolidColorBrush(Colors.Green),
                            StrokeEndLineCap = PenLineCap.Round
                        };
                        contacts[ptrId] = currentContact;
                        ((System.Collections.Generic.IList<UIElement>)DrawingArea.Children).Add(l);
                    }
                }
            }
            else
            {
                Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(DrawingArea);
                uint ptrId = pt.PointerId;
                if (contacts.ContainsKey(ptrId) && contacts[ptrId].HasValue)
                {
                    Point currentContact = pt.Position;
                    Point previousContact = contacts[ptrId].Value;
                    if (Distance(currentContact, previousContact) > 4)
                    {
                        Line l = new Line()
                        {
                            X1 = previousContact.X,
                            Y1 = previousContact.Y,
                            X2 = currentContact.X,
                            Y2 = currentContact.Y,
                            StrokeThickness = THICKNESS + 12,
                            Stroke = new SolidColorBrush(Colors.White),
                            StrokeEndLineCap = PenLineCap.Round
                        };
                        contacts[ptrId] = currentContact;
                        ((System.Collections.Generic.IList<UIElement>)DrawingArea.Children).Add(l);
                    }
                }
            }
            e.Handled = true;
        }
        private double Distance(Point currentContact, Point previousContact)
        {
            return Math.Sqrt(Math.Pow(currentContact.X - previousContact.X, 2) + Math.Pow(currentContact.Y - previousContact.Y, 2));
        }
        void DrawingArea_PointerPressed(object sender, PointerRoutedEventArgs e)
        {
            Windows.UI.Input.PointerPoint pt = e.GetCurrentPoint(DrawingArea);
            contacts[pt.PointerId] = pt.Position;
            e.Handled = true;
            ++ActiveContacts;
        }
        int i = 0;
        public void AllClear()
        {
            ((System.Collections.Generic.IList<UIElement>)DrawingArea.Children).Clear();
            ActiveContacts = 0;
            if (contacts != null)
            {
                contacts.Clear();
            }
        }
        private void Draw_Click_1(object sender, RoutedEventArgs e)
        {
            i = 0;
        }
        private void Erase_Click_1(object sender, RoutedEventArgs e)
        {
            i = 1;
        }
        private void Reset_Click_1(object sender, RoutedEventArgs e)
        {
            AllClear();
        }
    }
}
Step 5
Output
Now, our Windows Store App is ready to run. Press F5 to run it.
You will see that there are 3 buttons and one white canvas in which you can write or paint.
![Pointer-input-events-in-Windows-Store-Apps.jpg]()
Select the Draw button to draw onto the given canvas.
![pointer-moved-event-windows-store-apps.jpg]()
Select the Erase button to erase the content of the canvas.
![pointer-released-event-in-windows-store-apps.jpg]()
The Reset button is used to remove all the content of the canvas at once.