65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在 Silverlight 4 工具包中实现 ListBox 之间的拖放?

2010年5月13日

CPOL

4分钟阅读

viewsIcon

166696

downloadIcon

1969

在本文中,我将向您展示如何使用 Silverlight 4 Toolkit 创建一个拖放 ListBox。在这里,您将学习如何在两个 ListBox 之间以及在同一个 ListBox 内进行拖放。

引言

在本文中,我将讨论 Silverlight ListBox 控件内的拖放功能。本文还将涵盖两个 ListBox 控件之间的拖放操作。在这里,我们将使用 Silverlight 4 Toolkit 来实现此功能。

DragDropListBox_3.png DragDropListBox_6.png

背景

Silverlight ListBox 默认不包含拖放功能。因此,实现该功能曾是一个大问题。我们不得不为该功能编写大量的代码。但是,使用 Silverlight Toolkit,您可以非常轻松地完成此操作。您可以从 CodePlex Silverlight Toolkit 站点 下载 Silverlight 4 Toolkit。

Using the Code

Silverlight 4 Toolkit 有一个名为 ListBoxDragDropTarget 的控件,它具有在 ListBox 控件内执行拖放操作的功能。让我们开始创建我们的示例应用程序,其中包含两个 ListBox 控件,并用一些虚拟数据填充其中一个。我们将能够将 ListBox 元素拖放到同一个 ListBox 控件内,也能将其拖放到第二个 ListBox 控件中。

  • 首先,创建一个名为“Silverlight4.DragDropListBox”的 Silverlight 应用程序。
  • 现在,右键单击 Silverlight 项目,然后单击“添加引用”。在“添加引用”对话框中,为您的项目添加 Silverlight Toolkit 程序集引用。添加程序集引用后,您可以在应用程序中的任何位置使用它。
  • 现在打开 _MainPage.xaml_ 并将 Toolkit DLL 引用添加到其中,以便我们可以在页面中使用工具包控件。添加后,它将如下所示:
<UserControl x:Class="Silverlight4.DragDropListBox.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"
    xmlns:toolKit="clr-namespace:System.Windows.Controls;
		assembly=System.Windows.Controls.Toolkit">
</UserControl>

在此,下面提到的行是对 Silverlight Toolkit 的引用。我们用“toolkit”作为前缀来引用,以便我们可以使用“toolkit:”关键字来引用 Silverlight Toolkit。

xmlns:toolKit="clr-namespace:System.Windows.Controls;
	assembly=System.Windows.Controls.Toolkit"

让我们将 ListBoxDragDropTarget 添加到 Grid 中。将“AllowDrop”属性设置为 True。设置为 true 后,它就能捕获控件内的拖放事件。

<toolKit:ListBoxDragDropTarget AllowDrop="True">
</toolKit:ListBoxDragDropTarget>

现在,我们将在刚刚添加到 XAML 页面的 ListBoxDragDropTarget 中添加一个 ListBox 。设置 ListBox 控件的正确高度和宽度。此外,我们将设置 DisplayMemberPath=”Name”。这是因为我们将获取一些虚拟 Person 信息,并将 ListBox ItemSource 设置为该数据,其中 Person 有一个名为“Name”的属性。人员的姓名将在此处下拉列表中可见。

<toolKit:ListBoxDragDropTarget AllowDrop="True">
  <ListBox x:Name="customerListBoxMain"
	Height="200" Width="200" DisplayMemberPath="Name">
    <ListBox.ItemsPanel>
      <ItemsPanelTemplate>
        <StackPanel Orientation="Vertical"/>
      </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
  </ListBox>
</toolKit:ListBoxDragDropTarget>

让我们创建另一个由 ListBoxDragDropTarget 包围的 ListBox 控件。在这里,我们还将设置前面提到的相同属性。

<toolKit:ListBoxDragDropTarget AllowDrop="True">
  <ListBox Height="200" Width="200" DisplayMemberPath="Name">
    <ListBox.ItemsPanel>
      <ItemsPanelTemplate>
        <StackPanel Orientation="Vertical"/>
      </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
  </ListBox>
</toolKit:ListBoxDragDropTarget>

完成 XAML 视图的创建后,我们可以继续从代码隐藏获取一些数据并将其设置为第一个 ListBox 的 Source。这是示例代码:

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();

        customerListBoxMain.ItemsSource = PersonDataProvider.GetData();
    }
}

两个 ListBox 之间的拖放

设计和编码完成后,我们可以运行 Silverlight 应用程序来展示我们的工作。按 F5 在浏览器中运行应用程序。加载后,您将在屏幕上看到两个 Listbox 控件。一个包含一些虚拟数据,另一个为空。

DragDropListBox_1

现在,我们将从第一个 listbox 中拖动一个元素到外部。我们将看到鼠标光标更改为“不可用”图标。一旦您释放鼠标,您会注意到该项并未被放置在指定位置。为什么?因为我们只将两个 Listbox 控件标记为 DropTarget

DragDropListBox_2

现在,我们再次从第一个 listbox 开始拖动操作,这次我们将它拖到第二个 Listbox 控件内。发生了什么?鼠标光标现在带有一个小箭头。这表明该项可以在此处放置。

DragDropListBox_3

只需释放鼠标光标,您就会看到该元素已从第一个 listbox 中移除并添加到第二个列表中。

DragDropListBox_4

同一 ListBox 内的拖放

在这里,我们将看到同一个 ListBox 控件内的拖放操作。开始拖动任何元素,并在同一个 ListBox 控件内将其向上或向下移动。您将看到光标已更改为拖放图标,即光标旁边的箭头。此外,它还会在 ListBox 内显示一条线。这是将要发生拖放操作的位置。

DragDropListBox_6

释放鼠标,您将看到该项已移动到新位置。

DragDropListBox_7

如果列表很大,并且您想将元素重新定位到列表下方的特定位置,只需将其拖动到末尾。您将看到滚动条已自动开始滚动。

DragDropListBox_8

关注点

这在您想在 treeview 内或在 listbox 控件之间执行拖放操作时非常有用。当最终用户重新排列项目列表时,您也会发现它很有用。

请留下您的反馈/建议/评论。

另外,别忘了投它一票。

© . All rights reserved.