Xamarin Forms 如何制作可拖动的列表视图
Posted
技术标签:
【中文标题】Xamarin Forms 如何制作可拖动的列表视图【英文标题】:Xamarin Forms How to make a draggable listview 【发布时间】:2014-09-28 14:30:54 【问题描述】:是否可以使用 Xamarin 表单创建带有可拖动列表项的列表视图?
我在下面的链接中找到了在 android 中实现的引用,但我不确定如何在 Xamarin.Forms 中进行此操作,我想我需要为此添加平台特定代码?
How to make a ListView with draggable items?
此外,从下面的 Xamarin 论坛帖子中可以看出,控件似乎不支持拖放功能,因此需要创建自定义渲染器,但我不太确定从哪里开始
http://forums.xamarin.com/discussion/18114/do-the-xamarin-forms-controls-support-drag-drop-runtime-functionality
【问题讨论】:
如果有人正在寻找可拖动列表的 xamarin android 本机解决方案,那么您可以在这里查看:appliedcodelog.com/2019/08/… 【参考方案1】:
对于 ios,您可以利用本机 UITableView
控件的重新排序功能。为 ListView
创建一个自定义渲染器,告诉 iOS 您希望所有行都可移动。让它更新源列表的顺序以匹配用户的操作。
从子类开始。
public class EditListView : ListView
然后添加一个自定义渲染器来更新ListView.ItemsSource
以反映更改的顺序。此代码假定ItemsSource
是List<ListItem>
,其中ListItem
具有Id
和Name
字符串类型的属性。
[assembly: ExportRenderer(typeof(EditListView), typeof(EditListViewRenderer))]
public class EditListViewRenderer : ListViewRenderer
protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
base.OnElementChanged(e);
if (e.NewElement != null)
Control.Source = new TableViewSource((List<ListItem>)e.NewElement.ItemsSource);
Control.Editing = true;
class TableViewSource : UITableViewSource
readonly List<ListItem> items;
public TableViewSource(List<ListItem> items) this.items = items;
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
var item = items[indexPath.Row];
var cell = new UITableViewCell(UITableViewCellStyle.Default, item.Id); // No recycling. If the list is big enough to need recycling, the user won't be very happy about reordering it by hand. :-)
cell.TextLabel.Text = item.Name;
return cell;
public override void MoveRow(UITableView tableView, NSIndexPath sourceIndexPath, NSIndexPath destinationIndexPath)
int source = sourceIndexPath.Row, dest = destinationIndexPath.Row;
var movedItem = items[source];
items.RemoveAt(source);
if (source > dest) --source;
items.Insert(dest, movedItem);
public override nint RowsInSection(UITableView tableview, nint section) => items.Count;
public override bool CanMoveRow(UITableView tableView, NSIndexPath indexPath) => true;
public override bool CanEditRow(UITableView tableView, NSIndexPath indexPath) => true; // Only editable rows can be moved.
public override bool ShouldIndentWhileEditing(UITableView tableView, NSIndexPath indexPath) => false;
public override UITableViewCellEditingStyle EditingStyleForRow(UITableView tableView, NSIndexPath indexPath) => UITableViewCellEditingStyle.None;
【讨论】:
【参考方案2】:正如您在链接中指出的那样,仅使用提供的 Xamarin.Forms 控件是不可能的。
因此,您必须为每个平台实施自定义渲染器。
可以在http://developer.xamarin.com/guides/cross-platform/xamarin-forms/custom-renderer/找到一个很棒的教程
在该页面的最底部是一个视频,我真的建议您观看它,因为它提供了非常丰富的信息,应该可以让您为 AndroidCustom Renderer 类/strong> 和 iOS。相同的原则适用于 Windows Phone,所以如果您也想定位它,它也不应该太难。
【讨论】:
感谢您的链接,请查看教程并尝试实施 @ChadBonthuys - 你最终得到这个工作了吗?如果你能发布你的解决方案那就太好了:) @JeremyThompson 我很久以前就遇到过这个问题,从那时起 Xamarin.Forms 已经走了很长一段路。当时,我使用带有向上/向下箭头的自定义视图单元格进行了一个简单的实现,其中 PropertyChangedEventHandler 绑定到列表视图以刷新事件激活时的项目源。从那时起,Xamarin 已经发布了长按事件和更好的触摸手势,所以我确信现在这是可能的,但从那以后我没有重新审视它。这是对可能对您有帮助的链接的参考smartmobidevice.blogspot.co.za/2015/02/…以上是关于Xamarin Forms 如何制作可拖动的列表视图的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Forms - 如何使用可点击图像制作自定义视图?
如何使用 Xamarin Forms 为 iOS 项目制作可点击的滑块?
我们可以在 xamarin.forms 中制作可滚动的底部标签页吗