概述Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章带您快速进入Silverlight 2开发。íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
本文为系列文章第五篇,利用前面讲过的鼠标事件处理实现简单的拖放功能。íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
准备XAML在实现拖放功能中,分为三个步骤:íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
1.按下鼠标,触发MouseLeftButtonDown事件,选择要拖动的对象。íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
2.移动鼠标,触发MouseMove事件,移动选择的对象。íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
3.放开鼠标,触发MouseLeftButtonUp事件,停止捕捉事件。íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
做一个简单的界面,用一个按钮来显示拖放,如下XAML声明:íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
<Canvas Background="#46461F">íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    <
ButtoníÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
       
MouseLeftButtonDown="OnMouseDown"íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
       
MouseMove="OnMouseMove"íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
     
MouseLeftButtonUp="OnMouseUp"íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
       
Canvas.Left="50" Canvas.Top="50" Background="Red"íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
     
FontSize="18"íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
     
Width="160" Height="80">íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
        <
Button.Content>íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
            <
StackPanel Orientation="Horizontal" HorizontalAlignment="Center"íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
                       
VerticalAlignment="Center">íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
                <
Image Source="smile_6.png"></Image>íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
                <
TextBlock Text="拖动我" VerticalAlignment="Center" Margin="10"></TextBlock>íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
            </
StackPanel>íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
        </
Button.Content>íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    </
Button>íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
</
Canvas>íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
这里为了界面显示效果,使用了控件模板,后续会专门讲到。íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
开始拖放操作开始拖放操作,实现MouseLeftButtonDown事件处理程序,用两个全局变量来记录当前鼠标的位置和鼠标是否保持移动。íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
bool trackingMouseMove = false;Point mousePosition;void OnMouseDown(object sender, MouseButtonEventArgs e){íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    FrameworkElement element = sender as FrameworkElement;íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    mousePosition = e.GetPosition(null);íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    trackingMouseMove = true;íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    if (null != element)íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    {íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
        element.CaptureMouse();íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
        element.Cursor = Cursors.Hand;íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    }íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
}íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
移动对象移动对象,实现MouseMove事件处理程序,计算元素的位置并更新,同时更新鼠标的位置。íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
void OnMouseMove(object sender, MouseEventArgs e){íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    FrameworkElement element = sender as FrameworkElement;íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    if (trackingMouseMove)íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    {íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
        double deltaV = e.GetPosition(null).Y - mousePosition.Y;íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
        double deltaH = e.GetPosition(null).X - mousePosition.X;íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
        double newTop = deltaV + (double)element.GetValue(Canvas.TopProperty);íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
        double newLeft = deltaH + (double)element.GetValue(Canvas.LeftProperty);íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
        element.SetValue(Canvas.TopProperty, newTop);íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
        element.SetValue(Canvas.LeftProperty, newLeft);íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
        mousePosition = e.GetPosition(null);íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    }íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
}íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
完成拖放操作完成拖放操作,实现MouseLeftButtonUp事件处理程序。íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
void OnMouseUp(object sender, MouseButtonEventArgs e){íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    FrameworkElement element = sender as FrameworkElement;íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    trackingMouseMove = false;íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    element.ReleaseMouseCapture();íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    mousePosition.X = mousePosition.Y = 0;íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
    element.Cursor = null;íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
}íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
效果显示最终,完成后的效果如下íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
拖动按钮íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ
结束语本文实现了一个简单的拖放功能(示例来自于Silverlight 2 SDK),点击下载文本示例代码。íÉ ò±?Cçwww.netcsharp.cnMá!¿WeëßfÈ