Ryland
Ryland

Reputation: 79

'MouseEventArgs' does not contain a definition for 'GetPosition'

Im sure this is a super easy one but I am working on a C# UWP app and am trying to make a drag-able user control but in my mouse event I'm getting the following error:

CS1061 'MouseEventArgs' does not contain a definition for 'GetPosition' and no extension method 'GetPosition' accepting a first argument of type 'MouseEventArgs' could be found (are you missing a using directive or an assembly reference?)

I found this example I am using on stack (Dragging a WPF user control) and have used mouse down events before for dragging items between list boxes in winforms but didn't have this issue.

Here is my code:

<UserControl
    x:Class="HopHaus.TimerControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:HopHaus"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="400" Width="120" Height="60">

    <Grid Margin="0,0,0,167" Width="120">
        <Rectangle Fill="#FF404040" HorizontalAlignment="Left" Height="60" Margin="1,0,-1,-133" Stroke="Black" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="timersetBox" Margin="-1,-2,1,-59" TextWrapping="Wrap" Text="00" VerticalAlignment="Top" Height="60" BorderBrush="Transparent" FontFamily="Fonts/DIGITAL.TTF#Digital" Foreground="#FF72FB00" FontSize="50" Background="Transparent" TextAlignment="Right" AcceptsReturn="True" SelectionHighlightColor="#000078D7" Width="120"/>
        <Border x:Name="dragBrdr" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" Height="59" Margin="2,0,0,-59" VerticalAlignment="Top" Width="118"/>
    </Grid>
</UserControl>

And:

 public sealed partial class TimerControl : UserControl
    {
        Point currentPoint;
        Point anchorPoint;
        bool isInDrag;
        public TimerControl()
        {
            this.InitializeComponent();
        }

        private TranslateTransform transform = new TranslateTransform();
        private void root_MouseMove(object sender, MouseEventArgs e)
        {
            if (isInDrag)
            {
                var element = sender as FrameworkElement;
                currentPoint = e.GetPosition(null);

                transform.X += currentPoint.X - anchorPoint.X;
                transform.Y += (currentPoint.Y - anchorPoint.Y);
                this.RenderTransform = transform;
                anchorPoint = currentPoint;
            }
        }
    }

I am using both using System.Windows.Input & using Windows.Devices.Input

Thanks a bunch in advance for any help provide.

Upvotes: 2

Views: 1901

Answers (2)

Sunteen Wu
Sunteen Wu

Reputation: 10627

but am still unsure how to take my var point and transform it into a new position of my user control on my MainPage

As @Dave Smits said you need a Pointer event handle. More details about handle pointer input please reference this document. I think what you confused is that this code var point = e.GetCurrentPoint(null); return PointerPoint object instead Point structure what you needed for transform. In that case, you can get the Point structure by PointerPoint.Position property. Updated code as follows:

<UserControl
    ...
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="400"  
   Width="120" Height="60"  PointerMoved="Grid_PointerMoved" CanDrag="True">
    <Grid Margin="0,0,0,167" Width="120" >
        <Rectangle Fill="#FF404040" HorizontalAlignment="Left" Height="60" Margin="1,0,-1,-133" Stroke="Black" VerticalAlignment="Top" Width="120"/>
        <TextBox x:Name="timersetBox" Margin="-1,-2,1,-59" TextWrapping="Wrap" Text="00" VerticalAlignment="Top" Height="60" BorderBrush="Transparent" FontFamily="Fonts/DIGITAL.TTF#Digital" Foreground="#FF72FB00" FontSize="50" Background="Transparent" TextAlignment="Right" AcceptsReturn="True" SelectionHighlightColor="#000078D7" Width="120"/>
        <Border x:Name="dragBrdr" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" Height="59" Margin="2,0,0,-59" VerticalAlignment="Top" Width="118"/>
    </Grid>
</UserControl>

Code behind

 Point currentPoint;
 Point anchorPoint;
 bool isInDrag;
 private TranslateTransform transform = new TranslateTransform();
 private void Grid_PointerMoved(object sender, PointerRoutedEventArgs e)
 {
     anchorPoint = new Point(300, 200);
     isInDrag = true;
     if (isInDrag)
     {
         var element = sender as FrameworkElement;
         PointerPoint currentPointpointer = e.GetCurrentPoint(null);
         currentPoint = currentPointpointer.Position;
         transform.X += currentPoint.X - anchorPoint.X;
         transform.Y += (currentPoint.Y - anchorPoint.Y);
         this.RenderTransform = transform;
         anchorPoint = currentPoint;
     }
 }

Additionally, for transform from one point to another I recommend you to use PointAnimation.

Upvotes: 0

Dave Smits
Dave Smits

Reputation: 1889

To have better support for touch and inking there is an abstraction over the mouse events. This is called pointer. So in you you have a PointerMoved event

in xaml:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
          PointerMoved="Grid_PointerMoved">

    </Grid>

and in code

    private void Grid_PointerMoved(object sender, PointerRoutedEventArgs e)
    {
        var point = e.GetCurrentPoint(null);
    }

Upvotes: 1

Related Questions