我评估了在 RadListView 组件的 UWP 部分中创建“RightClicked”事件并将该通知提供给控件的 XamarinForms 部分的方法。从技术上讲,这是可能的,但在编写应该提供通知的 UWP 相关类是内部的。这意味着无法使用 UWP ListViewItems 来提供该通知。
由于您很可能已经为 XamarinForms 中的 RadListView 设置了自定义 ItemTemplate,因此您可以考虑创建自定义 XamrinForms 控件(例如 Grid、Frame、Border、Label...),它具有UWP 的自定义渲染器。该渲染器可以订阅 UIElement.RightTapped Event 并将通知重新传输到控件的 XamarinForms 部分。
public class MyRightClickGridRenderer : ViewRenderer<MyRightClickGrid, Grid>
{
protected override void OnElementChanged(ElementChangedEventArgs<MyRightClickGrid> e)
{
if (this.Element != null)
{
if (this.Control == null)
{
var uwpGrid = new Grid { IsRightTapEnabled = true, Background = new SolidColorBrush(Colors.Transparent) };
uwpGrid.RightTapped += UwpGrid_RightTapped;
this.SetNativeControl(uwpGrid);
}
}
if (this.Element == null)
{
if (this.Control != null)
{
((Grid)this.Control).RightTapped -= UwpGrid_RightTapped;
}
}
}
private void UwpGrid_RightTapped(object sender, Windows.UI.Xaml.Input.RightTappedRoutedEventArgs e)
{
((MyRightClickGrid)this.Element).RaiseRightClicked(sender);
}
}
在 XamarinForms 项目中,您可以创建类似的东西
public class MyRightClickGrid : Grid
{
public event EventHandler<TappedEventArgs> RightTapped;
public void RaiseRightClicked(object sender)
{
this.RightTapped?.Invoke(this, new TappedEventArgs(null));
}
}
创建此控件后,您可以像这样在 XAML 中使用它:
<telerikListView:RadListView>
<telerikListView:RadListView.ItemTemplate>
<DataTemplate>
<telerikListViewPrimitives:ListViewTemplateCell>
<telerikListViewPrimitives:ListViewTemplateCell.View>
<MyNamespace:MyRightClickGrid >
***
</MyNamespace:MyRightClickGrid >
</telerikListViewPrimitives:ListViewTemplateCell.View>
</telerikListViewPrimitives:ListViewTemplateCell>
</DataTemplate>
</telerikListView:RadListView.ItemTemplate>
</telerikListView:RadListView>
让我知道这是否适合你。
附:这种方法的一个优点是您可以使用相同的渲染器来检索点击的位置。 XamarinForms 仍然不支持此功能,您应该为每个平台创建类似的逻辑以获取该信息。