Pinch-масштабирование изображения, но начало уменьшается - PullRequest
1 голос
/ 29 апреля 2020

Я пишу Pinch / Zoom в свое приложение, оно работает довольно хорошо, но я столкнулся с проблемой или двумя. Во-первых, я хочу, чтобы изображение начиналось полностью уменьшенным. Где вы видите все изображение. Во-вторых, я хочу, чтобы приложение перестало уменьшать масштаб при достижении этой точки. Таким образом, вы можете продолжать зажимать / панорамировать, но он не продолжает рассчитывать. Заранее спасибо за вашу помощь. Смотрите код ниже.

  public MainWindow()
    {
        InitializeComponent();
        var files = System.IO.Directory.GetFiles(@"D:\", "*.jpg");
        MainImage.Source = new BitmapImage(new Uri(files[0]));
}

 private void Image_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
    {
        e.ManipulationContainer = ScrollViewerParent;
        e.Handled = true;
    }

    private void Image_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
    {
        int nrOfPoints = 0;

        lock (mutex)
        {
            nrOfPoints = nrOfTouchPoints;
        }

        if (nrOfPoints >= 2)
        {                
            var matrix = MainImage.LayoutTransform.Value;

            Point? centerOfPinch = (e.ManipulationContainer as FrameworkElement)?.TranslatePoint(e.ManipulationOrigin, ScrollViewerParent);

            if (centerOfPinch == null)
            {
                return;
            }

            var deltaManipulation = e.DeltaManipulation;
            matrix.ScaleAt(deltaManipulation.Scale.X, deltaManipulation.Scale.Y, centerOfPinch.Value.X, centerOfPinch.Value.Y);
            MainImage.LayoutTransform = new MatrixTransform(matrix);

            Point? originOfManipulation = (e.ManipulationContainer as FrameworkElement)?.TranslatePoint(e.ManipulationOrigin, MainImage);

            double scrollViewerOffsetX = ScrollViewerParent.HorizontalOffset;
            double scrollViewerOffsetY = ScrollViewerParent.VerticalOffset;

            double pointMovedOnXOffset = originOfManipulation.Value.X - originOfManipulation.Value.X * deltaManipulation.Scale.X;
            double pointMovedOnYOffset = originOfManipulation.Value.Y - originOfManipulation.Value.Y * deltaManipulation.Scale.Y;

            double multiplicatorX = ScrollViewerParent.ExtentWidth / MainImage.ActualWidth;
            double multiplicatorY = ScrollViewerParent.ExtentHeight / MainImage.ActualHeight;

            ScrollViewerParent.ScrollToHorizontalOffset(scrollViewerOffsetX - pointMovedOnXOffset * multiplicatorX);
            ScrollViewerParent.ScrollToVerticalOffset(scrollViewerOffsetY - pointMovedOnYOffset * multiplicatorY);

            e.Handled = true;
        }
        else
        {
            ScrollViewerParent.ScrollToHorizontalOffset(ScrollViewerParent.HorizontalOffset - e.DeltaManipulation.Translation.X);
            ScrollViewerParent.ScrollToVerticalOffset(ScrollViewerParent.VerticalOffset - e.DeltaManipulation.Translation.Y);
        }
    }

    private void MainImage_TouchDown(object sender, TouchEventArgs e)
    {
        lock (mutex)
        {
            nrOfTouchPoints++;
        }
    }

    private void MainImage_TouchUp(object sender, TouchEventArgs e)
    {
        lock (mutex)
        {
            nrOfTouchPoints--;
        }
    }

<ScrollViewer Grid.Row="1"
        x:Name="ScrollViewerParent"
        HorizontalScrollBarVisibility="Auto"
        VerticalScrollBarVisibility="Auto"
        PanningMode="Both">
        <Image MouseDown="MainImage_MouseDown"
            x:Name="MainImage"

            IsManipulationEnabled="True"
            TouchDown="MainImage_TouchDown"
            TouchUp="MainImage_TouchUp"
            ManipulationDelta="Image_ManipulationDelta"
            ManipulationStarting="Image_ManipulationStarting"/>
    </ScrollViewer>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...