您的位置:首页 > 其它

Image实现鼠标的拖动(自己做的图片显示控件)

2011-06-05 10:12 676 查看
这是一个图片显示控件,这个控件用到了蒙版,图片只显示一部分,用鼠标拖动图片,可以转换显示的部分。这个控件是用在做相片处理的软件中的。我实现了相处部分显示,和拖动,但是在控件拖动的方面还不好(控制不能露出后面的背景,但是在拖动快的时候还是控件不住,所以我只控制了宽的拖动,等找到好方法再一起控制高的方向的拖动)

拖动是用的RenderTransform属性

页面代码:

<UserControl x:Class="DesignerSL.Views.Gifts.MiniPhotoControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:adorners="clr-namespace:Adorners"
mc:Ignorable="d"
d:DesignHeight="301" d:DesignWidth="222" Loaded="UserControl_Loaded">

<Grid x:Name="LayoutRoot" Background="White">
<Grid Name="gidPanel" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.ColumnSpan="3" Grid.RowSpan="3" Margin="0" >
<Canvas x:Name="panelDisplay">
<Canvas.Clip>
<RectangleGeometry x:Name="RectangGeome" />
</Canvas.Clip>
<Image Name="imgPhoto" Height="auto" Width="auto" Canvas.ZIndex="0" MouseLeftButtonDown="imgPhoto_MouseLeftButtonDown" MouseLeftButtonUp="imgPhoto_MouseLeftButtonUp" MouseMove="imgPhoto_MouseMove">
<!--<Image.Clip>
<RectangleGeometry x:Name="RectangGeome" />
</Image.Clip>-->
</Image>
</Canvas>
<!--<adorners:CursorPlane x:Name='cursorPlane' Canvas.Left="-38" Canvas.Top="-2" IsHitTestVisible="True" />-->
</Grid>
</Grid>

</UserControl>

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Media.Imaging;
using Adorners;
using Adorners.Frames;

namespace DesignerSL.Views.Gifts
{
public partial class MiniPhotoControl : UserControl
{
CropFrame frame2 = new CropFrame();
public double ImageX;
public double ImageY;
public PhotoInfo MiniImage { get; set; }
public double ControlHeight;
public double ControlWidth;
private double MengbanX;
private double MengbanY;

bool trackingMouseMove = false;
double deltax;
double deltay;
Point _point;

public MiniPhotoControl()
{
InitializeComponent();

}

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
this.Height = ControlHeight;
this.Width = ControlWidth;
imgPhoto.RenderTransform = new TranslateTransform();
RectangGeome.Rect = new Rect(0, 0, ControlWidth, ControlHeight);
AddPhoto();
}
private void AddPhoto()
{
WriteableBitmap PhotoData = MiniImage.PhotoData;

if (ControlHeight / PhotoData.PixelHeight < ControlWidth / PhotoData.PixelWidth)
{
imgPhoto.Width = ControlWidth;
imgPhoto.Height = PhotoData.PixelHeight * (ControlWidth / PhotoData.PixelWidth);
ImageX = 0;
ImageY = -(imgPhoto.Height - ControlHeight) / 2;
Canvas.SetLeft(imgPhoto, 0);
Canvas.SetTop(imgPhoto, ImageY);
//RectangGeome.Rect = new Rect(0, (imgPhoto.Height - ControlHeight) / 2, ControlWidth, ControlHeight);
}
else
{
imgPhoto.Height = ControlHeight;
imgPhoto.Width = PhotoData.PixelWidth * (ControlHeight / PhotoData.PixelHeight);
ImageX = -(imgPhoto.Width - ControlWidth) / 2;
ImageY = 0;
Canvas.SetTop(imgPhoto, 0);
Canvas.SetLeft(imgPhoto, ImageX);
//RectangGeome.Rect = new Rect((imgPhoto.Width - ControlWidth) / 2,0, ControlWidth, ControlHeight);
}
imgPhoto.Source = PhotoData;

}

void imgPhoto_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
FrameworkElement fe = (FrameworkElement)sender;
fe.Cursor = Cursors.Arrow;
trackingMouseMove = false;

}
void imgPhoto_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
FrameworkElement fe = (FrameworkElement)sender;
if (fe != null)
{
trackingMouseMove = true;
fe.CaptureMouse();
_point = e.GetPosition(null);
fe.Cursor = Cursors.Hand;
deltax = e.GetPosition(null).X - ((TranslateTransform)fe.RenderTransform).X;
deltay = e.GetPosition(null).Y - ((TranslateTransform)fe.RenderTransform).Y;
MengbanX = e.GetPosition(null).X;
MengbanY = e.GetPosition(null).Y;
}

}
void imgPhoto_MouseMove(object sender, MouseEventArgs e)
{
if (trackingMouseMove)
{
Image img = (Image)sender;

if (ImageX < 0 && ImageX > -System.Math.Abs(img.Width - ControlWidth))
{
ImageX = ImageX + (e.GetPosition(null).X - MengbanX);
((TranslateTransform)img.RenderTransform).X = e.GetPosition(null).X - deltax;
}
else if (ImageX >= 0 && e.GetPosition(null).X < MengbanX)
{
ImageX = ImageX + (e.GetPosition(null).X - MengbanX);
((TranslateTransform)img.RenderTransform).X = e.GetPosition(null).X - deltax;
}
else if (ImageX < -System.Math.Abs(img.Width - ControlWidth) && e.GetPosition(null).X > MengbanX)
{
ImageX = ImageX + (e.GetPosition(null).X - MengbanX);
((TranslateTransform)img.RenderTransform).X = e.GetPosition(null).X - deltax;
}
if (ImageY < 0)
{
ImageY = ImageY + (e.GetPosition(null).Y - MengbanY);
((TranslateTransform)img.RenderTransform).Y = e.GetPosition(null).Y - deltay;
}
MengbanX = e.GetPosition(null).X;
MengbanY = e.GetPosition(null).Y;

}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: