C# 收缩缩放图像,但开始缩小

C# 收缩缩放图像,但开始缩小,c#,.net,wpf,C#,.net,Wpf,我正在为我的应用程序编写Pinch/Zoom,我的应用程序运行得很好,但遇到了一两个问题。首先,我希望图像开始,完全缩小。在这里你可以看到整个画面。其次,我希望应用程序在达到该点时停止缩小。因此,您可以继续挤压/平移,但它不会继续计算。提前谢谢你的帮助。请参见下面的代码 public MainWindow() { InitializeComponent(); var files = System.IO.Directory.GetFiles(@"D:\"

我正在为我的应用程序编写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>
public主窗口()
{
初始化组件();
var files=System.IO.Directory.GetFiles(@“D:\”,“*.jpg”);
MainImage.Source=新的位图图像(新的Uri(文件[0]);
}
私有无效图像\u操纵开始(对象发送方,操纵开始事件参数e)
{
e、 操纵容器=ScrollViewerParent;
e、 已处理=正确;
}
私有void Image_操纵delta(对象发送方,操纵deltaeventargs e)
{
int nrOfPoints=0;
锁(互斥)
{
nrOfPoints=nrOfTouchPoints;
}
如果(NROF点数>=2)
{                
var矩阵=MainImage.LayoutTransform.Value;
点?中心点=(例如,操纵容器作为框架元素)?.TranslatePoint(例如,操纵原点,滚动视图顶点);
如果(centerOfPinch==null)
{
返回;
}
var deltaManipulation=e.deltaManipulation;
ScaleAt(deltaManipulation.Scale.X,deltaManipulation.Scale.Y,centerOfPinch.Value.X,centerOfPinch.Value.Y);
MainImage.LayoutTransform=新矩阵变换(矩阵);
点?操作的原点=(e.操纵容器作为框架元素)?.TranslatePoint(e.操纵原点,主图像);
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;
双乘法器x=ScrollViewerParent.extendWidth/MainImage.ActualWidth;
双重乘法=ScrollViewerParent.ExtentheRight/MainImage.ActualHeight;
ScrollViewerParent.ScrollToHorizontalOffset(scrollViewerOffsetX-pointMovedOnXOffset*乘法器x);
ScrollViewerParent.ScrollToVerticalOffset(scrollViewerOffsetY-pointMovedOnYOffset*乘法);
e、 已处理=正确;
}
其他的
{
ScrollViewerParent.ScrollToHorizontalOffset(ScrollViewerParent.HorizontalOffset-e.DeltaManipulation.Translation.X);
ScrollViewerParent.ScrollToVerticalOffset(ScrollViewerParent.VerticalOffset-e.DeltaManipulation.Translation.Y);
}
}
私有void main image_接地(对象发送方,TouchEventArgs e)
{
锁(互斥)
{
nrOfTouchPoints++;
}
}
private void MainImage_修补(对象发送方,TouchEventArgs e)
{
锁(互斥)
{
nrOfTouchPoints--;
}
}