问题是我无法获取显示上下文菜单的项目。
对于这个问题,如果你像这样向ListView添加数据:
<ListView RightTapped="ListView_RightTapped">
<x:String>First Item</x:String>
<x:String>Second Item</x:String>
<x:String>Third Item</x:String>
<x:String>Fourth Item</x:String>
<ListView.Resources>
<MenuFlyout x:Name="allContactsMenuFlyout">
<MenuFlyout.Items>
<MenuFlyoutItem x:Name="Edit" Text="Edit" />
<MenuFlyoutItem x:Name="Remove" Text="Remove" Click="Remove_Click" />
</MenuFlyout.Items>
</MenuFlyout>
</ListView.Resources>
</ListView>
您可以像这样在RightTapped 事件中获取项目的上下文:
private void ListView_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
ListView listView = (ListView)sender;
allContactsMenuFlyout.ShowAt(listView, e.GetPosition(listView));
var a = ((FrameworkElement)e.OriginalSource).DataContext;
}
在这种情况下,“a”会直接获取点击项的字符串格式内容。
如果您像这样使用DataTemplate 将数据添加到ListView:
<ListView RightTapped="ListView_RightTapped" ItemsSource="{x:Bind list}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding text}" />
</DataTemplate>
</ListView.ItemTemplate>
<ListView.Resources>
<MenuFlyout x:Name="allContactsMenuFlyout">
<MenuFlyout.Items>
<MenuFlyoutItem x:Name="Edit" Text="Edit" />
<MenuFlyoutItem x:Name="Remove" Text="Remove" Click="Remove_Click" />
</MenuFlyout.Items>
</MenuFlyout>
</ListView.Resources>
</ListView>
通常在使用DataTemplate 时,我们通过ObservableCollection 添加数据,如下所示:
private ObservableCollection<List> list = new ObservableCollection<List>();
public MainPage()
{
this.InitializeComponent();
list.Clear();
list.Add(new List { text = "Item 1" });
list.Add(new List { text = "Item 2" });
list.Add(new List { text = "Item 3" });
list.Add(new List { text = "Item 4" });
list.Add(new List { text = "Item 5" });
}
“List”类在这里测试很简单:
public class List
{
public string text { get; set; }
}
那么我们也可以在RightTapped事件中获取DataContext:
private void ListView_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
ListView listView = (ListView)sender;
allContactsMenuFlyout.ShowAt(listView, e.GetPosition(listView));
var a = ((FrameworkElement)e.OriginalSource).DataContext;
}
但这一次,“a”实际上是item内部的'List'对象(请参考“List”类),因为item的内容现在是一个'List'对象,不再是字符串了.所以我们可以像这样获取这个对象的 text 属性:
private void ListView_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
ListView listView = (ListView)sender;
allContactsMenuFlyout.ShowAt(listView, e.GetPosition(listView));
var a = ((FrameworkElement)e.OriginalSource).DataContext as List;
var content = a.text;
}
我认为最终你想编辑Flyout的按钮点击事件中的内容,你可以这样做例如:
private string content;
private void ListView_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
ListView listView = (ListView)sender;
allContactsMenuFlyout.ShowAt(listView, e.GetPosition(listView));
var a = ((FrameworkElement)e.OriginalSource).DataContext as List;
content = a.text;
}
private void Remove_Click(object sender, RoutedEventArgs e)
{
foreach (var item in list.ToList())
{
if (item.text == content)
{
list.Remove(item);
}
}
content = "";
}
另一个问题是上下文菜单也显示在列表视图项目之外(例如在边框上)。
你能解释一下吗?我不太明白。您的意思是在 Flyout? 中显示内容?如果是这样,我认为上面的方法可以解决这个问题。如果不行,可以留言,我看看能不能解决这个问题。
由于触发的事件是 RightTapped,我不确定在移动设备上长按是否会显示上下文菜单。
我认为这里的“长按”事件表示像这样的Holding事件?
private void ListView_Holding(object sender, HoldingRoutedEventArgs e)
{
ListView listView = (ListView)sender;
allContactsMenuFlyout.ShowAt(listView, e.GetPosition(listView));
var a = ((FrameworkElement)e.OriginalSource).DataContext as List;
content = a.text;
}
我只是在移动模拟器上测试它,它工作正常。这里虽然写了很长的答案,但是重点还是很简单的,直接用((FrameworkElement)e.OriginalSource).DataContext就可以得到item的Context了。