wpf 拖动图片,不想让Border里有余白

yfp15062328347 2016-03-24 09:28:34
/*
图片放大后,拖动图片,不想让Border里有余白。换句话说,如果图片向上拖,那么一旦图片的下边和Border的下边吻合后,图片就不能再网上拖了。求教各位该怎么做
*/
我根据了放大陪数来判断了 ,还是有bug
/*前台*/
<Window x:Class="WPFImagePanAndZoom.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="WPFWindow"
Title="WPF Pan And Zoom"
mc:Ignorable="d"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Height="610"
Width="566">

<Grid x:Name="LayoutRoot" >
<Grid.RowDefinitions>
<RowDefinition Height="152.92"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>

<Border Grid.Row="1" Name="border" ClipToBounds="True" Width="800" Height="900" >
<Image Name="image" Opacity="1" Source="/WPF%20Image%20Pan%20and%20Zoom;component/Images/test.tif" />
</Border>

<Label Content="Mousewheel to zoom. Hold left mousebutton to pan." Height="35" HorizontalAlignment="Center" Margin="123,12,128,0" Name="label1" VerticalAlignment="Top" Width="293" />
</Grid>
</Window>
/*C#*/
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private Point origin;
private Point start;

public MainWindow()
{
InitializeComponent();
WPFWindow.MouseWheel += MainWindow_MouseWheel;

image.MouseLeftButtonDown += image_MouseLeftButtonDown;
image.MouseLeftButtonUp += image_MouseLeftButtonUp;
image.MouseMove += image_MouseMove;
}

private void image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
image.ReleaseMouseCapture();

}

private bool mouseDown;
private Point mouseXY;

private void image_MouseMove(object sender, MouseEventArgs e)
{
/*
图片放大后,拖动图片,不想让Border里有余白。换句话说,如果图片向上拖,那么一旦图片的下边和Border的下边吻合后,图片就不能再网上拖了。求教各位该怎么做
*/
if (!image.IsMouseCaptured) return;
Point p = e.MouseDevice.GetPosition(border);
Matrix m = image.RenderTransform.Value;

double offsetx = origin.X + (p.X - start.X);
// m.OffsetX = origin.X + (p.X - start.X);
double c = 0 - (origin.X + (p.X - start.X));
if (offsetx <= 0 && c <= (border.Width * ScaleX)) //在这里判断过 可是不太行
{
if (c!=0)
{
m.OffsetX = offsetx;
}
//transform.X += position.X - m_PreviousMousePoint.X;

}
double OffsetY = origin.Y + (p.Y - start.Y);
double d = 0 - (origin.Y + (p.Y - start.Y));
if (OffsetY <= 0 && d <= border.Height) //在这里判断过 可是不太行
{
m.OffsetY = OffsetY;
}
//m.OffsetY = origin.Y + (p.Y - start.Y);
image.RenderTransform = new MatrixTransform(m);
}


private void image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (image.IsMouseCaptured) return;
image.CaptureMouse();

start = e.GetPosition(border);
origin.X = image.RenderTransform.Value.OffsetX;
origin.Y = image.RenderTransform.Value.OffsetY;
}
double i = 1;
double ScaleX = 1;
double ScaleY = 1;
private void MainWindow_MouseWheel(object sender, MouseWheelEventArgs e)
{
Point p = e.MouseDevice.GetPosition(image);

Matrix m = image.RenderTransform.Value;

if (e.Delta > 0)
{
i = i * 2;
ScaleX += ScaleX * 1.1;
ScaleY += ScaleY * 1.1;
m.ScaleAtPrepend(1.1, 1.1, p.X, p.Y);
}
else
{
i = i / 2;
if (i >= 1)
{
ScaleX += ScaleX / 1.1;
ScaleY += ScaleY / 1.1;
m.ScaleAtPrepend(1 / 1.1, 1 / 1.1, p.X, p.Y);
}
else
{
i = 1;
ScaleX = 1;
ScaleY = 1;
}
}
image.RenderTransform = new MatrixTransform(m);
}



}
...全文
127 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
鏡椛氹鈅 2016-03-24
  • 打赏
  • 举报
回复
贴出你具体要的效果图吧
exception92 2016-03-24
  • 打赏
  • 举报
回复
上图吧

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧