wpf 拖动图片,不想让Border里有余白
/*
图片放大后,拖动图片,不想让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);
}
}