我有一个带图像的画布。
<Canvas
x:Name="ImageCanvas"
SizeChanged="Root_OnSizeChanged">
<Canvas.Clip>
<RectangleGeometry
x:Name="RootGeometry"/>
</Canvas.Clip>
<Image
x:Name="Image"
Source="{Binding TestData, Converter={StaticResource TestDataToBitmapConverter} }"
HorizontalAlignment="Left"
VerticalAlignment="Top"
ManipulationStarted="OnManipulationStarted"
ManipulationDelta="OnManipulationDelta"
ManipulationCompleted="OnManipulationCompleted"
Stretch="None"
ImageOpened="OnImageOpened">
<Image.RenderTransform>
<TransformGroup>
<MatrixTransform x:Name="previousTransform" />
<TransformGroup x:Name="currentTransform">
<ScaleTransform x:Name="scaleTransform" />
<RotateTransform x:Name="rotateTransform" />
<TranslateTransform x:Name="translateTransform" />
</TransformGroup>
</TransformGroup>
</Image.RenderTransform>
</Image>
</Canvas>
当我在屏幕上移动图像时,仍然有可能丢失它。我使用 GetSquare 检查剩余的图像正方形,如果正方形非常小,我会尝试将图像推回
private double GetSquare()
{
Rect rect = Utils.GetBounds(Image, ImageCanvas);
var canvasRect = RootGeometry.Rect;
canvasRect.Intersect(rect);
return canvasRect.Height * canvasRect.Width;
}
double maxSquare=30000;
double allowedSquare=40000;
private void OnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
double square = GetSquare();
if (square < maxSquare || double.IsInfinity(square))
{
e.Complete();
int counter = 0;
while (GetSquare() <= allowedSquare)
{
counter++;
translateTransform.X -= 100 * e.Velocities.Linear.X;
translateTransform.Y -= 100 * e.Velocities.Linear.Y;
if (counter > 10)
{
ToInitState();
return;
}
}
}
else
{
translateTransform.X += e.Delta.Translation.X;
translateTransform.Y += e.Delta.Translation.Y;
}
//Rotate
rotateTransform.Angle += e.Delta.Rotation;
//Scale
double deltaScale = e.Delta.Scale;
double newScale = Utils.GetImageCurrentScale(Image) * deltaScale;
if (newScale < Utils.MAX_ZOOM && newScale > Utils.MIN_ZOOM)
{
scaleTransform.ScaleX *= deltaScale;
scaleTransform.ScaleY *= deltaScale;
}
}