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