c# wpf 图片缩放
布局文件:
<Grid x:Name="IMG" Background="Black">
<Grid.Resources>
<!--创建TransformGroup 集合,设立关键Key,并加入缩放和移动时所需函数。-->
<TransformGroup x:Key="Imageview">
<ScaleTransform/>
<TranslateTransform/>
</TransformGroup>
</Grid.Resources>
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Disabled" Background="Wheat" Cursor="SizeAll" Margin="5" Focusable="False" x:Name="BackFrame">
<ContentControl MouseLeftButtonDown="IMG1_MouseLeftButtonDown"
MouseLeftButtonUp="IMG1_MouseLeftButtonUp"
MouseMove="IMG1_MouseMove"
MouseWheel="IMG1_MouseWheel" >
<Image Name="IMG1" Source="/Images/aaa.jpg" RenderTransform="{StaticResource Imageview}" Stretch="Uniform" RenderOptions.BitmapScalingMode="NearestNeighbor" ></Image>
</ContentControl>
</ScrollViewer>
</Grid>
后台文件:
private bool mouseDown;
private Point mouseXY;
//鼠标按下时的事件,启用捕获鼠标位置并把坐标赋值给mouseXY.
private void IMG1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var img = sender as ContentControl;
if (img == null)
{
return;
}
img.CaptureMouse();
mouseDown = true;
mouseXY = e.GetPosition(img);
}
//鼠标松开时的事件,停止捕获鼠标位置。
private void IMG1_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
var img = sender as ContentControl;
if (img == null)
{
return;
}
img.ReleaseMouseCapture();
mouseDown = false;
}
//鼠标移动时的事件,当鼠标按下并移动时发生Domousemove(img, e);函数
private void IMG1_MouseMove(object sender, MouseEventArgs e)
{
var img = sender as ContentControl;
if (img == null)
{
return;
}
if (mouseDown)
{
Domousemove(img, e);
}
}
//group.Children中的第二个是移动的函数
//它根据X.Y的值来移动。并把当前鼠标位置赋值给mouseXY.
private void Domousemove(ContentControl img, MouseEventArgs e)
{
if (e.LeftButton != MouseButtonState.Pressed)
{
return;
}
var group = IMG.FindResource("Imageview") as TransformGroup;
var transform = group.Children[1] as TranslateTransform;
var position = e.GetPosition(img);
transform.X -= mouseXY.X - position.X;
transform.Y -= mouseXY.Y - position.Y;
mouseXY = position;
}
//鼠标滑轮事件,得到坐标,放缩函数和滑轮指数,由于滑轮值变化较大所以*0.001.
private void IMG1_MouseWheel(object sender, MouseWheelEventArgs e)
{
var img = sender as ContentControl;
if (img == null)
{
return;
}
var point = e.GetPosition(img);
var group = IMG.FindResource("Imageview") as TransformGroup;
var delta = e.Delta * 0.001;
DowheelZoom(group, point, delta);
}
//Group.Children中的第一个是放缩函数。
//如果ScaleX+滑轮指数小于0.1时就返回。
//var pointToContent = group.Inverse.Transform(point);
//获取此变换的逆变换的值
//使图片放缩后,放缩原点也随之变化。
private void DowheelZoom(TransformGroup group, Point point, double delta)
{
var pointToContent = group.Inverse.Transform(point);
var transform = group.Children[0] as ScaleTransform;
if (transform.ScaleX + delta < 0.1) return;
transform.ScaleX += delta;
transform.ScaleY += delta;
var transform1 = group.Children[1] as TranslateTransform;
transform1.X = -1 * ((pointToContent.X * transform.ScaleX) - point.X);
transform1.Y = -1 * ((pointToContent.Y * transform.ScaleY) - point.Y);
}

浙公网安备 33010602011771号