在WPF中向上/向下移动ListBoxItem

时间:2010-10-23 11:46:37

标签: wpf drag-and-drop listbox

我创建了一个包含文件名的列表框。我想让用户选择使用向上/向下按钮并使用拖放来上下移动文件名。

任何人都知道如何实现此功能。

XAML代码:

<ListBox
    Grid.Column="0"
    Name="listBox1"
    AllowDrop="True"
    Drop="listBox1_Drop"
/>
<StackPanel
    Grid.Column="1"
    HorizontalAlignment="Stretch"
    VerticalAlignment="Center">
    <Button
        Name="moveUp"
        Content="Ç"
        FontFamily="Wingdings 3"
        Margin="3,3,3,3"
        Click="moveUp_Click" />
    <Button
        Name="moveDown"
        FontFamily="Wingdings 3"
        Content="È"
        Margin="3,3,3,3" />
</StackPanel>

3 个答案:

答案 0 :(得分:7)

如果你不想实现复杂的东西,可以像这样处理Move Up和Move Down。如果源看起来像这样

public ObservableCollection<FileClass> FileNames
{
    get;
    set;
}

private void moveUp_Click(object sender, RoutedEventArgs e)
{
    FileClass selectedfile = listBox1.SelectedItem as FileClass;
    int index = FileNames.IndexOf(selectedfile);
    if (index > 0)
    {
        FileNames.Remove(selectedfile);
        FileNames.Insert(index-1, selectedfile);
        listBox1.SelectedItem = selectedfile;
    }
}

private void moveDown_Click(object sender, RoutedEventArgs e)
{
    FileClass selectedfile = listBox1.SelectedItem as FileClass;
    int index = FileNames.IndexOf(selectedfile);
    if (index < FileNames.Count-1)
    {
        FileNames.Remove(selectedfile);
        FileNames.Insert(index + 1, selectedfile);
        listBox1.SelectedItem = selectedfile;
    }
}

更改
尝试使用此代码通过在ListBox中拖放来上下移动项目

private void listBox1_Drop(object sender, DragEventArgs e)
{
    ListBox parent = sender as ListBox;
    FileClass data = e.Data.GetData(typeof(FileClass)) as FileClass;
    FileClass objectToPlaceBefore = GetObjectDataFromPoint(parent, e.GetPosition(parent)) as FileClass;
    if (data != null && objectToPlaceBefore != null)
    {
        int index = FileNames.IndexOf(objectToPlaceBefore);
        FileNames.Remove(data);
        FileNames.Insert(index, data);
        listBox1.SelectedItem = data;
    }
}

private void listBox1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    ListBox parent = sender as ListBox;
    FileClass data = GetObjectDataFromPoint(parent, e.GetPosition(parent)) as FileClass;
    if (data != null)
    {
        DragDrop.DoDragDrop(parent, data, DragDropEffects.Move);
    }
}

private static object GetObjectDataFromPoint(ListBox source, Point point)
{
    UIElement element = source.InputHitTest(point) as UIElement;
    if (element != null)
    {
        object data = DependencyProperty.UnsetValue;
        while (data == DependencyProperty.UnsetValue)
        {
            data = source.ItemContainerGenerator.ItemFromContainer(element);
            if (data == DependencyProperty.UnsetValue)
                element = VisualTreeHelper.GetParent(element) as UIElement;
            if (element == source)
                return null;
        }
        if (data != DependencyProperty.UnsetValue)
            return data;
    }

    return null;
}

那应该完成拖拽。

答案 1 :(得分:0)

如果您绑定按钮,可以尝试:

private void MoveItemUp()
    {
        if (SelectedGroupField != null)
        {
            List<string> tempList = AvailableGroupField;
            string selectedItem = SelectedGroupField;

            int currentIndex = tempList.IndexOf(selectedItem);

            if (currentIndex > 0)
            {
                tempList.Remove(selectedItem);
                tempList.Insert(currentIndex - 1, selectedItem);
                AvailableGroupField = null;
                AvailableGroupField = tempList;
                SelectedGroupField = AvailableGroupField.Single(p => p == selectedItem);
            }
        }
    }

    private void MoveItemDown()
    {
        if (SelectedGroupField != null)
        {
            List<string> tempList = AvailableGroupField;
            string selectedItem = SelectedGroupField;

            int currentIndex = tempList.IndexOf(selectedItem);

            if (currentIndex < (tempList.Count - 1))
            {
                tempList.Remove(selectedItem);
                tempList.Insert(currentIndex + 1, selectedItem);
                AvailableGroupField = null;
                AvailableGroupField = tempList;
                SelectedGroupField = AvailableGroupField.Single(p => p == selectedItem);
            }
        }        
    }

答案 2 :(得分:-1)

请参考此示例...可能它可以帮助您

http://www.c-sharpcorner.com/UploadFile/dpatra/760/Default.aspx