Pro Silverlight 3 in C# - 拖拽示例
<UserControl
xmlns:controlsToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"
x:Class="HichinaMeetingShow.UI.MainPage"
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"
mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
<Canvas x:Name="parentCanvas" MouseLeftButtonDown="canvas_Click" Background="White">
</Canvas>
</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;
namespace HichinaMeetingShow.UI
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
// Keep track of when an ellipse is being dragged.
private bool isDragging = false;
// When an ellipse is clicked, record the exact position
// where the click is made.
private Point mouseOffset;
private void canvas_Click(object sender, MouseButtonEventArgs e)
{
// Create an ellipse (unless the user is in the process
// of dragging another one).
if (!isDragging)
{
// Give the ellipse a 50-pixel diameter and a red fill.
Ellipse ellipse = new Ellipse();
ellipse.Fill = new SolidColorBrush(Colors.Red);
ellipse.Width = 50;
ellipse.Height = 50;
// Use the current mouse position for the center of
// the ellipse.
Point point = e.GetPosition(this);
ellipse.SetValue(Canvas.TopProperty, point.Y - ellipse.Height / 2);
ellipse.SetValue(Canvas.LeftProperty, point.X - ellipse.Width / 2);
// Watch for left-button clicks.
ellipse.MouseLeftButtonDown += ellipse_MouseDown;
// Add the ellipse to the Canvas.
parentCanvas.Children.Add(ellipse);
}
}
private void ellipse_MouseDown(object sender, MouseButtonEventArgs e)
{
// Dragging mode begins.
isDragging = true;
Ellipse ellipse = (Ellipse)sender;
// Get the position of the click relative to the ellipse
// so the top-left corner of the ellipse is (0,0).
mouseOffset = e.GetPosition(ellipse);
// Change the ellipse color.
ellipse.Fill = new SolidColorBrush(Colors.Green);
// Watch this ellipse for more mouse events.
ellipse.MouseMove += ellipse_MouseMove;
ellipse.MouseLeftButtonUp += ellipse_MouseUp;
// Capture the mouse. This way you'll keep receiving
// the MouseMove event even if the user jerks the mouse
// off the ellipse.
ellipse.CaptureMouse();
}
private void ellipse_MouseMove(object sender, MouseEventArgs e)
{
if (isDragging)
{
Ellipse ellipse = (Ellipse)sender;
// Get the position of the ellipse relative to the Canvas.
Point point = e.GetPosition(parentCanvas);
// Move the ellipse.
ellipse.SetValue(Canvas.TopProperty, point.Y - mouseOffset.Y);
ellipse.SetValue(Canvas.LeftProperty, point.X - mouseOffset.X);
}
}
private void ellipse_MouseUp(object sender, MouseButtonEventArgs e)
{
if (isDragging)
{
Ellipse ellipse = (Ellipse)sender;
// Change the ellipse color.
ellipse.Fill = new SolidColorBrush(Colors.Orange);
// Don't watch the mouse events any longer.
ellipse.MouseMove -= ellipse_MouseMove;
ellipse.MouseLeftButtonUp -= ellipse_MouseUp;
ellipse.ReleaseMouseCapture();
isDragging = false;
}
}
}
}
book mark: 182