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