#695 – 实现一个简单的拖拽(Implementing Drag-and-Drop Behavior)

下面例子中的代码实现了从一个TextBox 中拖拽文字到一个ListBox 里。

在XAML中,我们指定TextBoxMouseDown 事件处理韩式和ListBoxDrop 事件处理函数。并且要设置ListBoxAllowDrop 属性为true(表示允许接收拖拽的输入).

<StackPanel Orientation="Vertical" Grid.Column="0" Margin="10">
    <Label Content="Enter some text and then drag to list"/>
    <TextBox Text="" MouseDown="txtMouseDown"/>
</StackPanel>
<ListBox Grid.Column="1" Margin="10" AllowDrop="True" Drop="lbDrop"/>

TextBoxMouseDown 事件处理函数中,我们执行DragDrop.DoDragDrop 静态方法(可以理解为将要拖动的数据进行“装车”,等待出发)。

private void txtMouseDown(object sender, MouseButtonEventArgs e)
{
    TextBox txtElement = e.Source as TextBox;
 
    DragDrop.DoDragDrop(txtElement, txtElement.SelectedText, DragDropEffects.Copy);
}

ListBoxDrop 事件处理函数中我们对拖拽接收到的数据进行处理,添加到列表中去。

private void lbDrop(object sender, DragEventArgs e)
{
    string draggedText = (string)e.Data.GetData(DataFormats.StringFormat); // 设置接受的数据类型为文本
 
    ListBox lbox = e.Source as ListBox;
    lbox.Items.Add(draggedText);
}

我们设置了某个控件的AllowDrop 属性为true以后,这个控件就可以接受各种拖拽过来的数据,但是并不是所有的数据它都想接受,因此我们可以通过调用IDataObject.GetData 方法来指定要接收的目标数据类型。比如在上面的例子中设置接受的数据类型为文本。

在我们调用了DragDrop.DoDragDrop 函数,指定了要进行拖传递的数据后,这些数据不仅可以在当前应用程序内传递,还可以传递给其他的应用程序。例如将你的文本,图片之类的数据传递给Word文档。



********************************************译者注*****************************************
DragDrop.DoDragDrop 是一个阻塞函数,如果整个拖拽动作(拖动目标->移动->放开)没有完成,它是不会返回的,会阻塞后面的函数。
在拖拽事件中如果想获取鼠标当前的坐标应该使用DragEventArgs的GetPosition函数,Mouse.GetPosition 在拖拽的时候无法获取到鼠标位置。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值