我创建了一个包含文件名的列表框。我想让用户选择使用向上/向下按钮并使用拖放来上下移动文件名。
任何人都知道如何实现此功能。
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>
答案 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