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;
}
}
}
}
拖动是用的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;
}
}
}
}
相关文章推荐
- Android通过自定义ImageView控件实现图片的缩放和拖动的实现代码
- 响应鼠标点击的代码实现了在单独线程中下载图片并在ImageView显示
- jQuery 实现全选全不选,删除选中复选框所在行,鼠标悬停在图片上显示大图
- 自己写的鼠标单击按钮实现图片切换
- Android UI控件之ImageSwitcher实现图片切换效果
- Android ImageView,布局或控件显示网络图片教程
- 加载网络图片显示进度条,可支持所有继承 imageview 的控件
- 安卓学习笔记(一)Android ImageButton、ImageView控件属性设置 图片显示问题
- ImageView+OkHttpUtils实现简单图片显示
- Control Study -> 实现:用鼠标拖动图片
- Android DragImageView实现下拉拖动图片放大效果
- Android ImageView实现图片裁剪和显示功能
- CSS实现鼠标滑过时显示图片说明
- Android自定义ImageView实现圆形控件显示
- Image 控件显示二进制图片
- MFC GDI+实现以鼠标为中心缩放图片(并且可以拖动)
- 自己写的鼠标单击按钮实现图片切换
- Image图片在控件中的显示方式
- 使用GridView和ImageView组件实现图片显示效果
- VC++下载图片然后控件显示JPG图片的实现