如何通过拖放在一个大的垂直列表中重新排序项目,同时保持垂直可滚动性?

时间:2011-04-22 17:59:18

标签: c# silverlight windows-phone-7 drag-and-drop scroll

Windows Phone上有很多关于Drag and Drop的提示,但我目前无法将所有内容放在一起。所以我希望你能给我一些建议来实现我的目标:显示具有良好重新排序和滚动体验的可滚动项目列表。

我使用StackPanel来显示控件的垂直列表。假设这些控件是CheckBoxes显示一些信息(实际上我创建了一些更复杂的自定义控件)。可能有很多项目,因此我在ScrollViewer周围放置StackPanel,以便用户可以向上和向下滚动。但现在我还想让用户有机会通过拖放重新排序列表中的控件。

我不清楚几件事情:

  1. 如何在StackPanel中启用拖放功能? (因此它看起来很流畅,并且项目在动画中改变位置,很好看,方式;当用户拖动它时,它们应该为要插入的项目留出空间。)
  2. 如何才能实现用户垂直滚动列表,同时还能拖放项目? (我认为用户必须拖动的每个项目都可能有一个特殊的“拖动点”,所以我可以区分拖动和滚动。)
  3. 如果列表大于屏幕,当用户将一个项目拖动到上边框或下边框时,如何自动滚动列表?
  4. 这甚至是控件的正确组合吗?还有更好的吗? (但我不想手动计算项目位置。)
  5. 我很想听听您对此主题的看法,非常感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

您可以参考此link。这有一个很好的重新排序列表框与垂直滚动。按住要拖动的项目1分钟并开始拖动。

答案 2 :(得分:1)

你寻求的答案是Jason Ginchereau开发的ReorderListBox控件。

我将展示它的快速实现,但如果您想要完整的演示,请从CodePlex here下载源代码。

首先,从Nuget安装控件:

  • 工具>>> 图书馆资讯包经理>>> 管理解决方案的NuGet包...
  • 搜索 ReorderListBox ,并安装 Jason Ginchereau
  • 创建的

然后,在应用开始页面的XAML中(例如 MainPage.xaml ),将突出显示的程序集引用复制并粘贴到 phone:PhoneApplicationPage 标记中其他程序集引用所在的顶部。

    xmlns:rlb="clr-namespace:ReorderListBox;assembly=ReorderListBox"

接下来,将其放入您的XAML页面

    <rlb:ReorderListBox
        x:Name="reorderListBox"
        Grid.Row="2"
        Margin="12,0,12,12"
        IsReorderEnabled="True">
            <rlb:ReorderListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock
                        Margin="12,4,12,4"
                        FontSize="36"
                        Text="{Binding}" />
                 </DataTemplate>
            </rlb:ReorderListBox.ItemTemplate>
    </rlb:ReorderListBox>

最后,在您的代码隐藏(即 MainPage.xaml.cs )中,您希望使用您的数据列表定义ObservableCollection并将其分配给{{1} }。您可能还希望在下次打开应用程序之后保存列表的状态。这是一个例子:

reorderListBox.ItemsSource