Maui for android pinch gesture container issue

Haviv Elbsz 1,886 Reputation points
2024-03-27T19:11:29.31+00:00

Hello All. I use Ver 17.10 preview 1 and Android Ver 34.

I try to add Pinch Gesture Container and I get an error message.

As below:

What I miss. Please any help. Thank you.


//Error I get
//MainPage.xaml : XamlC error : Failed to resolve assembly: 'PinchGesture, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
// File
// MainPage.xml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="RazKmoShed.MainPage" Loaded="MainPage_Loaded" x:Name="myContentPage"
             xmlns:mct="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
             xmlns:local="clr-namespace:RazKmoShed;assembly=PinchGesture"
             xmlns:label="clr-namespace:RazKmoShed"
             xmlns:entry="clr-namespace:RazKmoShed"
             FlowDirection="LeftToRight" BackgroundColor="#ECE5DD"  >
    <ScrollView x:Name="topscroll" HorizontalScrollBarVisibility="Never" VerticalScrollBarVisibility="Never" >
<local:PinchToZoomContainer>
    <VerticalStackLayout x:Name="vLayout" Margin="10" Padding="5" Spacing="5" BackgroundColor="#ECE5DD" >
   . . . . . . . . ...
    </VerticalStackLayout>
</local:PinchToZoomContainer>
    </ScrollView>
</ContentPage>
// File
// PinchToZoomContainer.cs 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RazKmoShed
{
  public class PinchToZoomContainer : ContentView
  {
    double currentScale = 1;
    double startScale = 1;
    double xOffset = 0;
    double yOffset = 0;
    public PinchToZoomContainer()
    {
        PinchGestureRecognizer pinchGesture = new PinchGestureRecognizer();
        pinchGesture.PinchUpdated += OnPinchUpdated;
        GestureRecognizers.Add(pinchGesture);
    }
    void OnPinchUpdated(object sender, PinchGestureUpdatedEventArgs e)
    {
        if (e.Status == GestureStatus.Started)
        {
            // Store the current scale factor applied to the wrapped user interface element,
            // and zero the components for the center point of the translate transform.
            startScale = Content.Scale;
            Content.AnchorX = 0;
            Content.AnchorY = 0;
        }
        if (e.Status == GestureStatus.Running)
        {
            // Calculate the scale factor to be applied.
            currentScale += (e.Scale - 1) * startScale;
            currentScale = Math.Max(1, currentScale);
            // The ScaleOrigin is in relative coordinates to the wrapped user interface element,
            // so get the X pixel coordinate.
            double renderedX = Content.X + xOffset;
            double deltaX = renderedX / Width;
            double deltaWidth = Width / (Content.Width * startScale);
            double originX = (e.ScaleOrigin.X - deltaX) * deltaWidth;
            // The ScaleOrigin is in relative coordinates to the wrapped user interface element,
            // so get the Y pixel coordinate.
            double renderedY = Content.Y + yOffset;
            double deltaY = renderedY / Height;
            double deltaHeight = Height / (Content.Height * startScale);
            double originY = (e.ScaleOrigin.Y - deltaY) * deltaHeight;
            // Calculate the transformed element pixel coordinates.
            double targetX = xOffset - (originX * Content.Width) * (currentScale - startScale);
            double targetY = yOffset - (originY * Content.Height) * (currentScale - startScale);
            // Apply translation based on the change in origin.
            Content.TranslationX = Math.Clamp(targetX, -Content.Width * (currentScale - 1), 0);
            Content.TranslationY = Math.Clamp(targetY, -Content.Height * (currentScale - 1), 0);
            // Apply scale factor
            Content.Scale = currentScale;
        }
        if (e.Status == GestureStatus.Completed)
        {
            // Store the translation delta's of the wrapped user interface element.
            xOffset = Content.TranslationX;
            yOffset = Content.TranslationY;
        }
    }
  }
}


.NET MAUI
.NET MAUI
A Microsoft open-source framework for building native device applications spanning mobile, tablet, and desktop.
2,869 questions
0 comments No comments
{count} votes

Accepted answer
  1. Yonglun Liu (Shanghai Wicresoft Co,.Ltd.) 35,546 Reputation points Microsoft Vendor
    2024-03-28T05:53:40.0066667+00:00

    Hello,

    This error is caused by assembly=PinchGesture.

    According to the explanation of Mapping to Custom Classes and Assemblies, this attribute usually points to a dll or other extension file.

    assembly= The assembly that contains some or all of the referenced CLR namespace. This value is typically just the name of the assembly, not the path, and does not include the extension (such as .dll or .exe). The path to that assembly must be established as a project reference in the project file that contains the XAML you are trying to map. In order to incorporate versioning and strong-name signing, the assembly value can be a string as defined by AssemblyName, rather than the simple string name.

    Workaround 1:

    Modify xmlns:local="clr-namespace:RazKmoShed;assembly=PinchGesture" to xmlns:local="clr-namespace:RazKmoShed"

    Workaround 2:

    Modify xmlns:local="clr-namespace:RazKmoShed;assembly=PinchGesture" to xmlns:local="clr-namespace:RazKmoShed;assembly=RazKmoShed"

    Best Regards,

    Alec Liu.


    If the answer is the right solution, please click "Accept Answer" and kindly upvote it. If you have extra questions about this answer, please click "Comment".

    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.


0 additional answers

Sort by: Most helpful