wpf 图片缩放

根据鼠标滚轮缩放图片及拖动(可查看UCLeaveAndOverBlock)

以下是根据网上一些代码调整测试后的代码
xaml
<Image x:Name="imgUpload" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="5,0,0,0" Grid.Row="3" Grid.Column="1"
Source="{Binding UploadImage, Converter={StaticResource byteAndImageSourceConverter},UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
RenderOptions.ClearTypeHint="Enabled" RenderOptions.BitmapScalingMode="HighQuality" SnapsToDevicePixels="True"
UseLayoutRounding="True"
MouseDown="img_MouseDown"
MouseWheel="img_MouseWheel"
MouseMove="img_MouseMove"
MouseUp="img_MouseUp"
MouseLeave="img_MouseLeave"
>
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform x:Name="sfr" />
<TranslateTransform x:Name="tlt" />
</TransformGroup>
</Image.RenderTransform>
</Image>

后台cs
#region 根据鼠标滚轮缩放图片及拖动
private bool isMouseLeftButtonDown = false;
Point previousMousePoint = new Point(0, 0);
private void img_MouseDown(object sender, MouseButtonEventArgs e)
{
isMouseLeftButtonDown = true;
previousMousePoint = e.GetPosition(imgUpload);
}

private void img_MouseUp(object sender, MouseButtonEventArgs e)
{
isMouseLeftButtonDown = false;
}

private void img_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
isMouseLeftButtonDown = false;

}

private void img_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
if (isMouseLeftButtonDown == true)
{
Point position = e.GetPosition(imgUpload);
tlt.X += position.X - this.previousMousePoint.X;
tlt.Y += position.Y - this.previousMousePoint.Y;
}
}
private void img_MouseWheel(object sender, MouseWheelEventArgs e)
{
Point centerPoint = e.GetPosition(imgUpload);

double val = (double)e.Delta / 20; //描述鼠标滑轮滚动
if (sfr.ScaleX < 0.3 && sfr.ScaleY < 0.3 && e.Delta < 0)
{
return;
}
if (e.Delta < -6)
{
tlt.X = 0;
tlt.Y = 0;
}
sfr.CenterX = centerPoint.X;
sfr.CenterY = centerPoint.Y;
sfr.ScaleX += val;
sfr.ScaleY += val;
}
#endregion

 

小知识点:

要想让滚动条显示出来除了设置滚动条先关属性外还要设置固定的宽高

//该样式应用于所有类型控件
<Style TargetType="{x:Type Control}"/>


C#代码中的Contain方法,例如 A =‘2/11/12’ B = '1' C='2'
A.Contain(B) = false;A.Contain(C) = true
(注意到了吗?是分割后进行的对比,不同于sql中的like字符)

 

posted @   马玲  阅读(1547)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示