下拉菜单&;右键单击Xamarin.Forms UWP中的列表项
我正在努力显示下拉菜单上点击的图像,也右键单击和显示菜单上的列表视图行。 我设法得到了一些相对布局和框架的帮助,但它占用了空间,也没有进入正确的位置 这是我设法得到的 但我必须把它做成下面的样子。应该删除空间。菜单应位于堆栈布局上方。有没有办法让它超越stacklayout?像下面这样 同样在下面显示的列表中,我想添加右键单击和显示菜单选项,这也需要在列表视图上显示框架或其他布局。见下图。任何帮助或例子都会对我有很大帮助 下拉菜单&右键单击Xamarin.Forms UWP中的列表项 Xamarin下拉菜单&;右键单击Xamarin.Forms UWP中的列表项,uwp,xamarin.uwp,Uwp,Xamarin.uwp,我正在努力显示下拉菜单上点击的图像,也右键单击和显示菜单上的列表视图行。 我设法得到了一些相对布局和框架的帮助,但它占用了空间,也没有进入正确的位置 这是我设法得到的 但我必须把它做成下面的样子。应该删除空间。菜单应位于堆栈布局上方。有没有办法让它超越stacklayout?像下面这样 同样在下面显示的列表中,我想添加右键单击和显示菜单选项,这也需要在列表视图上显示框架或其他布局。见下图。任何帮助或例子都会对我有很大帮助 下拉菜单&右键单击Xamarin.Forms UWP中的列表项 Xa
ViewCell
具有可用于响应ListView项右键单击的ContextActions
属性。不幸的是,菜单项很难定制
<ViewCell.ContextActions>
<MenuItem Text="Add" Clicked="Add_Clicked"></MenuItem>
<MenuItem Text="Delete" Clicked="Delete_Clicked"></MenuItem>
<MenuItem Text="Edit" Clicked="Edit_Clicked"></MenuItem>
</ViewCell.ContextActions>
UWP客户端
public class CustomListView :ListView
{
public event ItemRightTappedEventHandler ItemRightTapped;
public void RaiseItemRightTapped(ItemRightTappedEventArgs e)
{
if (ItemRightTapped != null)
this.ItemRightTapped(this, e);
}
}
public delegate void ItemRightTappedEventHandler(object sender, ItemRightTappedEventArgs e);
public class ItemRightTappedEventArgs : EventArgs
{
#region Fields
private object itemData = null;
private Point position;
#endregion
#region Constructor
public ItemRightTappedEventArgs(object itemData, Point position)
{
this.itemData = itemData;
this.position = position;
}
#endregion
#region Property
public object ItemData
{
get { return itemData; }
}
public Point Position
{
get { return position; }
}
#endregion
}
[assembly: ExportRenderer(typeof(CustomListView), typeof(CustomListViewRender))]
namespace DropDownMenuTest.UWP
{
public class CustomListViewRender : ListViewRenderer
{
ListView listView;
Xamarin.Forms.ITemplatedItemsView<Xamarin.Forms.Cell> TemplatedItemsView => Element;
object clickItemdataContext;
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ListView> e)
{
base.OnElementChanged(e);
listView = Control as ListView;
if (Control != null)
{
listView.Loaded += ListView_Loaded;
}
}
protected override void OnApplyTemplate()
{
base.OnApplyTemplate();
}
private void ListView_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
listView.RightTapped += ListView_RightTapped;
}
private void ListView_RightTapped(object sender, Windows.UI.Xaml.Input.RightTappedRoutedEventArgs e)
{
var orig = e.OriginalSource as DependencyObject;
int index = -1;
// Work our way up the tree until we find the actual list item
// the user tapped on
while (orig != null && orig != List)
{
var lv = orig as ListViewItem;
if (lv != null)
{
index = TemplatedItemsView.TemplatedItems.GetGlobalIndexOfItem(lv.Content);
clickItemdataContext = listView.ItemFromContainer(lv);
break;
}
orig = VisualTreeHelper.GetParent(orig);
}
if (index > -1)
{
var point = e.GetPosition(listView);
OnListItemClicked(clickItemdataContext, new Xamarin.Forms.Point(point.X, point.Y));
}
}
void OnListItemClicked(object context, Xamarin.Forms.Point point)
{
var tappedEventArgs = new ItemRightTappedEventArgs(context, new Xamarin.Forms.Point(point.X, point.Y));
var customListView = Element as CustomListView;
customListView.RaiseItemRightTapped(tappedEventArgs);
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
}
}
}
[程序集:ExportRenderer(typeof(CustomListView)、typeof(CustomListViewRender))]
名称空间DropDownMenuTest.UWP
{
公共类CustomListViewRender:ListViewRenderer
{
列表视图列表视图;
Xamarin.Forms.ItemPlatedItemView TemplatedItemView=>元素;
对象clickItemdataContext;
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
listView=控件作为listView;
if(控件!=null)
{
listView.Loaded+=listView\u Loaded;
}
}
受保护的覆盖无效OnApplyTemplate()
{
base.OnApplyTemplate();
}
已加载私有无效列表视图(对象发送方,Windows.UI.Xaml.RoutedEventArgs e)
{
listView.RightTapped+=listView_RightTapped;
}
私有void ListView_RightTapped(对象发送方,Windows.UI.Xaml.Input.RightTappedRoutedEventArgs e)
{
var orig=e.OriginalSource作为DependencyObject;
int指数=-1;
//沿着树往上爬,直到找到实际的列表项
//用户点击
while(orig!=null&&orig!=List)
{
var lv=原始作为ListViewItem;
如果(lv!=null)
{
index=TemplatedItemsView.TemplatedItems.GetGlobalIndexOfItem(lv.Content);
单击ItemDataContext=listView.ItemFromContainer(lv);
打破
}
orig=VisualTreeHelper.GetParent(orig);
}
如果(索引>-1)
{
变量点=e.GetPosition(listView);
OnListItemClicked(clickItemdataContext,new Xamarin.Forms.Point(Point.X,Point.Y));
}
}
void OnListItemClicked(对象上下文,Xamarin.Forms.Point)
{
var tappedEventArgs=new ItemRightTappedEventArgs(context,new Xamarin.Forms.Point(Point.X,Point.Y));
var customListView=作为customListView的元素;
customListView.RaiseItemRightTapped(tappedEventArgs);
}
受保护的覆盖无效OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
}
}
}
用法
<local:CustomListView
x:Name="MainListView"
HasUnevenRows="True"
ItemRightTapped="MainListView_ItemRightTapped"
>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
<Label
FontSize="25"
Text="{Binding .}"
TextColor="Navy"
/>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</local:CustomListView>
private void MainListView_ItemRightTapped(object sender, ItemRightTappedEventArgs e)
{
// show popup view
}
私有void MainListView_ItemRightTapped(对象发送方,ItemRightTappedEventArgs e)
{
//显示弹出视图
}