Я добавил Pan Gesture к изображению, используя код позади, затем в обновленном методе жеста панорамирования я назвал все его случаи.
Это происходит сразу после запуска и установил относительную координату собственного вида (изображения) в родительский вид (окно). Затем он останавливается и не выполняет какой-либо вызов метода жеста панорамирования. Ниже приведен код.
/*Creation of image*/
void CreateImage() {
var panGestureRecognizer = new PanGestureRecognizer();
panGestureRecognizer.PanUpdated += PanGestureRecognizer_PanUpdated;
Image image = new Image()
{
HeightRequest = 40,
WidthRequest = 40,
Margin = new Thickness( 10, 10, 10, 0 ),
Aspect = Aspect.AspectFit,
VerticalOptions = LayoutOptions.Start,
Source = ImageSource.FromUri( new Uri( $"{codebookJSONModel.Violation.IconPath}" ) ),
};
image.GestureRecognizers.Add( panGestureRecognizer );
}
/*PanGesture Updated Event*/
private async void PanGestureRecognizer_PanUpdated( object sender, PanUpdatedEventArgs e ) {
Console.WriteLine( "PanGestureRecognizer_PanUpdated" );
var layout = (Image)sender;
switch ( e.StatusType ) {
case GestureStatus.Started:
Console.WriteLine( "PanGestureRecognizer_Started" );
inspectionViewModel.totalX = 0;
inspectionViewModel.totalY = 0;
break;
case GestureStatus.Running:
// Translate and ensure we don't pan beyond the wrapped user interface element bounds.
Debug.WriteLine( "PanGestureRecognizer_Running" );
var screenCoordinates = DependencyService.Get<ICommonDependent>().GetViewPositionInSuperView( layout, this.Content );
inspectionViewModel.totalX = e.TotalX;
inspectionViewModel.totalY = e.TotalY;
Debug.WriteLine( "e.TotalX: " + e.TotalX + "e.TotalY: " + e.TotalY );
double superViewX = screenCoordinates.x + inspectionViewModel.totalX;
double superViewY = screenCoordinates.y + inspectionViewModel.totalY - layout.Height / 2;
uxViolationMarkerImgView.IsVisible = true;
Debug.WriteLine( $"x = {superViewX}, y = {superViewY}" );
DisplayOnGoingMarkerAsView( superViewX, superViewY );
break;
case GestureStatus.Completed:
// Store the translation applied during the pan
Debug.WriteLine( "PanGestureRecognizer_Completed" );
var lastScreenCoordinates = DependencyService.Get<ICommonDependent>().GetViewPositionInSuperView( layout, uxMapView );
double mapViewX = lastScreenCoordinates.x + inspectionViewModel.totalX + layout.Width / 2;
double mapViewY = lastScreenCoordinates.y + inspectionViewModel.totalY + layout.Height / 2;
Debug.WriteLine( $"x = {mapViewX}, y = {mapViewY}" );
uxViolationMarkerImgView.IsVisible = false;
break;
case GestureStatus.Canceled:
Debug.WriteLine( "PanGestureRecognizer_Canceled" );
uxViolationMarkerImgView.IsVisible = false;
break;
}
}
/*GetViewPositionInSuperView method to get child element position inside window*/
public ( double x, double y ) GetViewPositionInSuperView( Xamarin.Forms.View layout, Xamarin.Forms.View superview = null ) {
var nativeView = Xamarin.Forms.Platform.UWP.Platform.GetRenderer( layout ).ContainerElement;
FrameworkElement relativePositionView;
if ( superview != null ) {
relativePositionView = Xamarin.Forms.Platform.UWP.Platform.GetRenderer( superview ).ContainerElement;
} else {
relativePositionView = Window.Current.Content as Frame;
}
var element_Visual_Relative = nativeView.TransformToVisual( relativePositionView );
///element_Visual_Relative.TransformPoint(new Point(0, 0));
Rect rectangle = element_Visual_Relative.TransformBounds( new Rect( new Point( nativeView.Margin.Left, nativeView.Margin.Top ), nativeView.RenderSize ) );
Console.WriteLine( $"NativeX: {rectangle.X} NativeY: {rectangle.Y}" );
return ( rectangle.X, rectangle.Y );
}