源代码下载(vs2010版本):/Files/timy/dragAndreSize.rar
以下是拖放控件的实例代码:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="#FFD9D7D7">
<StackPanel>
<Border Width="100" Height="50" CornerRadius="5" BorderBrush="Black" BorderThickness="3" MouseLeftButtonDown="Border_MouseLeftButtonDown" MouseMove="Border_MouseMove" MouseEnter="Border_MouseEnter" MouseLeave="Border_MouseLeave" MouseLeftButtonUp="Border_MouseLeftButtonUp">
<Button></Button>
</Border>
</StackPanel>
</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.Xml;
using System.Windows.Media.Imaging;
using System.Windows.Resources;
using System.IO;
using System.Windows.Browser;
using System.ServiceModel.Channels;
using System.ServiceModel;
using System.Windows.Threading;
using System.Threading;
namespace SilverlightApplication26
{
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
}
bool captured = false;
double ox = -1, oy = -1;
enum State { None, Left, Buttom, Top, Right };
State currentstate;
private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Border b = (Border)sender;
b.CaptureMouse();
captured = true;
}
private void Border_MouseMove(object sender, MouseEventArgs e)
{
CheckCursor(sender, e);
if (captured)
{
Border b = (Border)sender;
Point p = e.GetPosition(null);
if (ox != -1)
{
switch (currentstate)
{
case State.Right: { b.Width += (p.X - ox)*2; break;}
case State.Buttom: { b.Height += (p.Y - oy)*2; break; }
case State.Top: { b.Height += (oy - p.Y)*2; break; }
case State.Left: { b.Width += (ox - p.X)*2; break; }
}
}
ox = p.X;
oy = p.Y;
}
}
private void Border_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
Cursor = Cursors.Arrow;
Border b = (Border)sender;
b.ReleaseMouseCapture();
captured = false;
ox = -1; oy = -1;
}
private void Border_MouseLeave(object sender, MouseEventArgs e)
{if(!captured)
Cursor = Cursors.Arrow;
}
private void Border_MouseEnter(object sender, MouseEventArgs e)
{
CheckCursor(sender, e);
}
void CheckCursor(object sender, MouseEventArgs e)
{
Border b = (Border)sender;
Point p = e.GetPosition(b);
if (p.X >= b.ActualWidth - b.BorderThickness.Right || p.X <= b.BorderThickness.Left)
{
Cursor = Cursors.SizeWE;
if (p.X >= b.ActualWidth - b.BorderThickness.Right) { currentstate = State.Right; }
else { currentstate = State.Left; }
}
else if (p.Y >= b.ActualHeight - b.BorderThickness.Bottom || p.Y <= b.BorderThickness.Top)
{
Cursor = Cursors.SizeNS;
if (p.Y >= b.ActualHeight - b.BorderThickness.Bottom) { currentstate = State.Buttom; }
else
{
currentstate = State.Top;
}
}
}
}
}