Kri*_*rip 11 c# wpf drag-and-drop itemscontrol
我有一个带有DataTemplate的ItemsControl,它绑定到整数的ObservableCollection.
<ItemsControl Name="DimsContainer" ItemTemplate="{StaticResource DimensionsTemplate}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
并在Windows资源中:
<Window.Resources>
<DataTemplate x:Key="DimensionsTemplate" >
<TextBlock Text="{Binding}"
Padding="5"
VerticalAlignment="Center"
FontSize="32"/>
</DataTemplate>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)
我正在尝试实现在ItemsControl中拖放项目的能力(即能够重新排序整数).有没有人有一个如何做到这一点的简单例子?我连接了PreviewMouseMove,DragEnter和Drop事件.问题是我无法弄清楚如何确定拖动哪个项目以及拖动它的位置.似乎整个ItemsControl都被传递到事件中.
Kyl*_*Ren 10
这是我如何做到的一个例子.
XAML:
<Window.DataContext>
<local:MyViewModel />
</Window.DataContext>
<Grid>
<ScrollViewer>
<ListView ItemsSource="{Binding MyData}" HorizontalAlignment="Stretch" Name="listview" ScrollViewer.PanningMode="VerticalOnly">
<ListView.ItemTemplate>
<DataTemplate>
<Button Content="{Binding}"
Command="{Binding DataContext.MyCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
CommandParameter="{Binding}"
Margin="5 2" Width="150" Height="50"
FontSize="30" />
</DataTemplate>
</ListView.ItemTemplate>
<ListView.Resources>
<Style TargetType="Button">
<EventSetter Event="PreviewMouseMove" Handler="PreviewMouseMove" />
<EventSetter Event="Drop" Handler="Drop" />
<Setter Property="AllowDrop" Value="True" />
</Style>
</ListView.Resources>
</ListView>
</ScrollViewer>
</Grid>
Run Code Online (Sandbox Code Playgroud)
视图模型:
class MyViewModel
{
public MyViewModel()
{
MyCommand = new ICommandImplementation();
}
public ObservableCollection<string> MyData
{
get
{
return new ObservableCollection<string>(new string[]{
"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
"eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"
});
}
}
public ICommand MyCommand { get; private set; }
private class ICommandImplementation : ICommand
{
public bool CanExecute(object parameter) { return true; }
public event EventHandler CanExecuteChanged;
public void Execute(object parameter) { System.Windows.MessageBox.Show("Button clicked! " + (parameter ?? "").ToString()); }
}
}
Run Code Online (Sandbox Code Playgroud)
事件:
private void Drop(object sender, DragEventArgs e)
{
var source = e.Data.GetData("Source") as string;
if (source != null)
{
int newIndex = listview.Items.IndexOf((sender as Button).Content);
var list = listview.ItemsSource as ObservableCollection<string>;
list.RemoveAt(list.IndexOf(source));
list.Insert(newIndex, source);
}
}
private void PreviewMouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Task.Factory.StartNew(new Action(() =>
{
Thread.Sleep(500);
App.Current.Dispatcher.BeginInvoke(new Action(() =>
{
if (e.LeftButton == MouseButtonState.Pressed)
{
var data = new DataObject();
data.SetData("Source", (sender as Button).Content);
DragDrop.DoDragDrop(sender as DependencyObject, data, DragDropEffects.Move);
e.Handled = true;
}
}), null);
}), CancellationToken.None);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的例子有点复杂,因为每个项目list都是a Button和on Button click我也必须做一些动作.你的情况比较容易.
对许多开发人员而言,拖放可能会让人困惑.但下面是一些关键点如何做到:
使用
PreviewMouseMove事件实际开始拖动并在处理程序使用DragDrop.DoDragDrop事件中引发DragDrop相关事件和Cursors.sender参数是在此情况下捕获鼠标的元素UIElement正在被拖动.如果要更改当前拖动的元素的视觉效果,请使用
DragEnter&DragOvereventMouse.sender参数是当前拖过的元素/刚刚结束拖延的情况.使用
Dropevent来处理被删除的元素.sender参数是Drop发生的元素.使用
DataObjectobject在这些事件之间传递信息.SetData该类的方法用于在此中添加数据.这个方法有两个参数,它们像key-valuepair 一样工作.一旦设置,您可以通过传递as参数DragDrop使用GetData方法在下一个被调用的事件中获取此数据key.(即e.Data.GetData("Source"))
这是一个相对的帖子.
| 归档时间: |
|
| 查看次数: |
9232 次 |
| 最近记录: |