DragControl
原文:DragControl
<UserControl x:Class="ImageView.DragControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ImageView"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
<Style TargetType="{x:Type Thumb}" x:Key="CornerThumbStyle">
<Setter Property="Width" Value="{Binding CornerWidth, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"/>
<Setter Property="Height" Value="{Binding CornerWidth, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"/>
<Setter Property="BorderBrush" Value="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"/>
<Setter Property="BorderThickness" Value="3"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Thumb}">
<Border SnapsToDevicePixels="True"
Width="{TemplateBinding Width}"
Height="{TemplateBinding Height}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type Thumb}" x:Key="AreaThumbStyle">
<Setter Property="BorderBrush" Value="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Thumb}">
<Rectangle Margin="0"
Fill="{TemplateBinding Background}" SnapsToDevicePixels="True"
Stroke="{TemplateBinding BorderBrush}" Stretch="Fill"
StrokeThickness="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderThickness.Top, Mode=OneWay}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Grid x:Name="PART_MainGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--MiddleCenter-->
<Thumb Tag="8"
Focusable="True"
BorderBrush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=BorderBrush}"
BorderThickness="1"
Style="{StaticResource AreaThumbStyle}" Grid.RowSpan="3" Grid.ColumnSpan="3" Cursor="SizeAll" />
<!--TopLeft-->
<Thumb Tag="7" Visibility="{Binding ThumbVisible, UpdateSourceTrigger=PropertyChanged}"
BorderBrush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=BorderBrush}"
BorderThickness="2.5"
Margin="-2,-2,0,0"
Opacity="{Binding ThumbOpacity, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource CornerThumbStyle}" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Top" Cursor="SizeNWSE"/>
<!--TopCenter-->
<Thumb Tag="0" Visibility="{Binding ThumbVisible, UpdateSourceTrigger=PropertyChanged}"
BorderBrush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=BorderBrush}"
BorderThickness="2.5"
Margin="0,-2,0,0"
Style="{StaticResource CornerThumbStyle}"
Grid.Row="0"
Opacity="{Binding ThumbOpacity, UpdateSourceTrigger=PropertyChanged}"
Grid.Column="1"
HorizontalAlignment="Center" VerticalAlignment="Top" Cursor="SizeNS"/>
<!--TopRight-->
<Thumb Tag="1" Visibility="{Binding ThumbVisible, UpdateSourceTrigger=PropertyChanged}"
BorderBrush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=BorderBrush}"
Margin="0,-2,-2,0"
Opacity="{Binding ThumbOpacity, UpdateSourceTrigger=PropertyChanged}"
BorderThickness="2.5"
Style="{StaticResource CornerThumbStyle}" Grid.Row="0" Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Top" Cursor="SizeNESW"/>
<!--MiddleLeft-->
<Thumb Tag="6" Visibility="{Binding ThumbVisible, UpdateSourceTrigger=PropertyChanged}"
BorderBrush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=BorderBrush}"
Margin="-2,0,0,0"
BorderThickness="2.5"
Opacity="{Binding ThumbOpacity, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource CornerThumbStyle}" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" Cursor="SizeWE"/>
<!--MiddleRight-->
<Thumb Tag="2" Visibility="{Binding ThumbVisible, UpdateSourceTrigger=PropertyChanged}"
BorderBrush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=BorderBrush}"
Margin="0,0,-2,0"
BorderThickness="2.5"
Opacity="{Binding ThumbOpacity, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource CornerThumbStyle}" Grid.Row="1" Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Center" Cursor="SizeWE"/>
<!--BottomLeft-->
<Thumb Tag="5" Visibility="{Binding ThumbVisible, UpdateSourceTrigger=PropertyChanged}"
Margin="-2,0,0,-2"
BorderBrush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=BorderBrush}"
BorderThickness="2.5"
Opacity="{Binding ThumbOpacity, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource CornerThumbStyle}" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Bottom" Cursor="SizeNESW"/>
<!--BottomCenter-->
<Thumb Tag="4" Visibility="{Binding ThumbVisible, UpdateSourceTrigger=PropertyChanged}"
BorderBrush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=BorderBrush}"
Margin="0,0,0,-2"
BorderThickness="2.5"
Opacity="{Binding ThumbOpacity, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource CornerThumbStyle}" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Bottom" Cursor="SizeNS"/>
<!--BottomRight-->
<Thumb Tag="3" Visibility="{Binding ThumbVisible, UpdateSourceTrigger=PropertyChanged}"
BorderBrush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=BorderBrush}"
BorderThickness="2.5"
Margin="0,0,-2,-2"
Opacity="{Binding ThumbOpacity, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource CornerThumbStyle}" Grid.Row="2" Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Bottom" Cursor="SizeNWSE"/>
</Grid>
</UserControl>
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
namespace ImageView
{
/// <summary>
/// DragControl.xaml 的交互逻辑
/// </summary>
public partial class DragControl : UserControl, INotifyPropertyChanged
{
public DragControl()
{
InitializeComponent();
AddHandler(Thumb.DragStartedEvent, new RoutedEventHandler(Drag_Started));
AddHandler(Thumb.DragDeltaEvent, new DragDeltaEventHandler(Drag_Delta));
AddHandler(Thumb.DragCompletedEvent, new RoutedEventHandler(Drag_Completed));
AddHandler(Thumb.GotFocusEvent, new RoutedEventHandler(OnGotFocus));
AddHandler(Thumb.LostFocusEvent, new RoutedEventHandler(OnLostFocus));
this.DataContext = this;
ThumbOpacity = 1.0f;
}
private void OnLostFocus(object sender, RoutedEventArgs e)
{
ThumbVisible = Visibility.Collapsed;
}
private void OnGotFocus(object sender, RoutedEventArgs e)
{
ThumbVisible = Visibility.Visible;
}
private void Drag_Started(object sender, RoutedEventArgs e)
{
ThumbOpacity = 0.1;
this.RaiseEvent( new RoutedEventArgs() { Source = this, RoutedEvent = OnDragStartedEvent });
}
private void Drag_Delta(object sender, DragDeltaEventArgs e)
{
Thumb thumb = e.OriginalSource as Thumb;
if (thumb == null)
{
return;
}
Int32 DragDirection = -1;
if (!Int32.TryParse((String)thumb.Tag, out DragDirection))
{
return;
}
double VerticalChange = e.VerticalChange;
double HorizontalChange = e.HorizontalChange;
Double left = Canvas.GetLeft(this);
Double top = Canvas.GetTop(this);
Double width = this.Width;
Double height = this.Height;
switch (DragDirection)
{
case 7:
height = this.Height - VerticalChange < 1 ? 1 : this.Height - VerticalChange;
top = Canvas.GetTop(this) + (this.Height - height);
width = this.Width - HorizontalChange < 1 ? 1 : this.Width - HorizontalChange;
left = Canvas.GetLeft(this) + (this.Width - width);
break;
case 0:
height = this.Height - VerticalChange < 1 ? 1 : this.Height - VerticalChange;
top = Canvas.GetTop(this) + (this.Height - height);
break;
case 1:
height = this.Height - VerticalChange < 1 ? 1 : this.Height - VerticalChange;
top = Canvas.GetTop(this) + (this.Height - height);
width = this.Width + HorizontalChange;
break;
case 6:
width = this.Width - HorizontalChange < 1 ? 1 : this.Width - HorizontalChange;
left = Canvas.GetLeft(this) + (this.Width - width);
break;
case 8:
left = Canvas.GetLeft(this) + HorizontalChange;
top = Canvas.GetTop(this) + VerticalChange;
break;
case 2:
width = this.Width + HorizontalChange;
break;
case 5:
width = this.Width - HorizontalChange < 1 ? 1 : this.Width - HorizontalChange;
left = Canvas.GetLeft(this) + (this.Width - width);
height = this.Height + VerticalChange;
break;
case 4:
height = this.Height + VerticalChange;
break;
case 3:
width = this.Width + HorizontalChange;
height = this.Height + VerticalChange;
break;
default:
break;
}
width = width < 1 ? 1 : width;
this.Width = width;
height = height < 1 ? 1 : height;
this.Height = height;
Canvas.SetTop(this, top);
Canvas.SetLeft(this, left);
this.RaiseEvent(new RoutedEventArgs() { Source = this, RoutedEvent = OnDragDeltaEvent });
//
e.Handled = true;
}
private void Drag_Completed(object sender, RoutedEventArgs e)
{
Rect NewBound = new Rect
{
Y = Canvas.GetTop(this),
X = Canvas.GetLeft(this),
Width = this.ActualWidth,
Height = this.ActualHeight
};
this.RaiseEvent(new RoutedEventArgs() { Source = this, RoutedEvent = OnDragCompletedEvent });
ThumbOpacity = 1;
e.Handled = true;
}
/// <summary>
/// 声明路由事件
/// 参数:要注册的路由事件名称,路由事件的路由策略,事件处理程序的委托类型(可自定义),路由事件的所有者类类型
/// </summary>
public static readonly RoutedEvent OnDragStartedEvent = EventManager.RegisterRoutedEvent("OnDragStarted", RoutingStrategy.Bubble, typeof(RoutedEventArgs), typeof(DragControl));
/// <summary>
/// 处理各种路由事件的方法
/// </summary>
public event RoutedEventHandler OnDragStarted
{
//将路由事件添加路由事件处理程序
add { AddHandler(OnDragStartedEvent, value, false); }
//从路由事件处理程序中移除路由事件
remove { RemoveHandler(OnDragStartedEvent, value); }
}
/// <summary>
/// 声明路由事件
/// 参数:要注册的路由事件名称,路由事件的路由策略,事件处理程序的委托类型(可自定义),路由事件的所有者类类型
/// </summary>
public static readonly RoutedEvent OnDragCompletedEvent = EventManager.RegisterRoutedEvent("OnDragCompleted", RoutingStrategy.Bubble, typeof(RoutedEventArgs), typeof(DragControl));
/// <summary>
/// 处理各种路由事件的方法
/// </summary>
public event RoutedEventHandler OnDragCompleted
{
//将路由事件添加路由事件处理程序
add { AddHandler(OnDragCompletedEvent, value, false); }
//从路由事件处理程序中移除路由事件
remove { RemoveHandler(OnDragCompletedEvent, value); }
}
/// <summary>
/// 声明路由事件
/// 参数:要注册的路由事件名称,路由事件的路由策略,事件处理程序的委托类型(可自定义),路由事件的所有者类类型
/// </summary>
public static readonly RoutedEvent OnDragDeltaEvent = EventManager.RegisterRoutedEvent("OnDragDelta", RoutingStrategy.Bubble, typeof(RoutedEventArgs), typeof(DragControl));
/// <summary>
/// 处理各种路由事件的方法
/// </summary>
public event RoutedEventHandler OnDragDelta
{
//将路由事件添加路由事件处理程序
add { AddHandler(OnDragDeltaEvent, value, false); }
//从路由事件处理程序中移除路由事件
remove { RemoveHandler(OnDragDeltaEvent, value); }
}
public Double ThumbOpacity
{
get
{
return __thumbopacity;
}
set
{
__thumbopacity = value;
RaisePropertyChanged("ThumbOpacity");
}
}
private Double __thumbopacity { get; set; }
public Visibility ThumbVisible
{
get
{
return __thumbvisible;
}
set
{
__thumbvisible = value;
RaisePropertyChanged("ThumbVisible");
}
}
private Visibility __thumbvisible { get; set; }
protected void RaisePropertyChanged(string propertyName)
{
// take a copy to prevent thread issues
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
DragControl的更多相关文章
- 漫谈可视化Prefuse(四)---被玩坏的Prefuse API
这个双12,别人都在抢红包.逛淘宝.上京东,我选择再续我的“漫谈可视化”系列(好了,不装了,其实是郎中羞涩...) 上篇<漫谈可视化Prefuse(三)---Prefuse API数据结构阅读有 ...
- 漫谈可视化Prefuse(三)---Prefuse API数据结构阅读有感
前篇回顾:上篇<漫谈可视化Prefuse(二)---一分钟学会Prefuse>主要通过一个Prefuse的具体实例了解了构建一个Prefuse application的具体步骤.一个Pre ...
- 漫谈可视化Prefuse(二)---一分钟学会Prefuse
前篇<漫谈可视化Prefuse(一)---从SQL Server数据库读取数据>主要介绍了prefuse如何连接数据库sql server并读取数据进行可视化展现. 回头想想还是应该好好捋 ...
- 漫谈可视化Prefuse(一)---从SQL Server数据库读取数据
上篇<可视化工具solo show-----Prefuse自带例子GraphView讲解>主要介绍了整个Prefuse工具集具有的一些特征.框架的运行流程,分析并展现了官方提供的例子Gra ...
- 可视化工具solo show-----Prefuse自带例子GraphView讲解
2014.10.15日以来的一个月,挤破了头.跑断了腿.伤透了心.吃够了全国最大餐饮连锁店——沙县小吃.其中酸甜苦辣,绝不是三言两语能够说得清道的明的.校招的兄弟姐妹们,你们懂得…… 体会最深的一句话 ...
- SilverLight页面跳转(转载)
// Silverlight页面的跳转 // (Application.Current.RootVisualasIContent).Content=newDragControl(); //Silver ...
- TChromeTabs 使用日记
1.如何让 Tab 在拖放时,拖放图形中带有 TabControl 的内容. 增加 ChromeTabs 的 NeedDragImageControl 事件,并在代码中设置 DragControl 为 ...
- prefuse学习(二)显示一张图
1. 把数据以点连线的方式在画面中显示 2. 数据按照数据的性别属性使用不同的颜色 3. 鼠标左键可以把图在画面中拖动 4. 鼠标右键可以把图放大或者缩小 5. 鼠标单击某个数据上,该数据点 ...
- DIV 实现可拖拽 功能(留档)
//可拖拽 功能 $.fn.extend({ //用法:$(element).jqDrag(); //element需要具备定位属性,需要手动调整层叠样式,这里只是修改鼠标拖动效果 ...
随机推荐
- [Node] Setup an Nginx Proxy for a Node.js App
Learn how to setup an Nginx proxy server that sits in front of a Node.js app. You can use a proxy to ...
- spark原理介绍 分类: B8_SPARK 2015-04-28 12:33 1039人阅读 评论(0) 收藏
1.spark是一个基于内存计算的开源的集群计算系统,目的是让数据分析更加快速.因此运行spark的机器应该尽量的大内存,如96G以上. 2.spark所有操作均基于RDD,操作主要分成2大类:tra ...
- oracle数据库的备份与恢复
一.备份 方法1: PLSQL中进行导出 对于方式1: 对于导出可执行文件的选择,可通过下面的几个参考位置去查找: 导入imp:F:\app\Administrator\product\11.1 ...
- IQueryFielter接口
IQueryFilter基于属性查询过滤数据.需要定义一个where子句.可以指定要返回值的字段列表.如果没有指定列,将返回所有值.当需要根据属性值和属性的关系过滤数据时,使用该接口. 成员 AddF ...
- php 下载图片到服务器
function saveImage($path) { if(!preg_match('/\/([^\/]+\.[a-z]{3,4})$/i',$path,$matches)) die('Use im ...
- windows cmd 查看文件目录树
windows + R ⇒ 输入 cmd ⇒ 进入 windows 命令行界面: tree/?:命令提示: tree:不输入任何参数,输出一棵目录树 不显示文件,只显示目录: tree/F:递归显示目 ...
- Linux 常用性能工具
Linux 常用性能工具简介. 一.wget 文件下载 使用wget下载单个文件:wget URL 下载并以不同的文件名保存:wget -O wordpress.zip URL wget限速下载:wg ...
- Android shape画圆点
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...
- 阿里巴巴fastjson的使用
一.项目结构 一个学生类.当中学生类中能够包括Course类对象 使用Maven管理项目的能够加入fastjson的坐标: <dependency> <groupId>com. ...
- 1046: 找不到类型,或者它不是编译时常数: PieSeries
如题所看到的,出现提示,这个是绘图相关的错误: