我公司有一个跨平台应用程序,主要用于带有Xamarin和Telerik某些控件的移动设备上。最近,我们一直在做更多工作,以使其在所有平台上都能正常工作(它最初是Android Java应用程序的端口)。目前的症结是Windows:虽然几乎所有功能都运行良好,但Telerik ListView给我们带来了麻烦。
我们目前使用长按事件来显示用于删除项目的UI。这很完美。这是在Telerik ListView中使用GestureRecognizer。问题是我们找不到用鼠标获得类似行为的方法:单击该项目具有我们希望保留的效果,并且它已经包含一个不可替代的复选框。理想情况下,我将设置一个右键单击事件并完成它,但是Telerik ListView控件上没有可用的右键单击事件。由于该控件不是UIElement,因此无法以我习惯的任何方式来定位其子级,并且节点本身似乎在运行时在实时可视树中被替换。
我可以看到ExtendedListViewItem控件,这似乎是我想要提供的鼠标事件处理程序,但是我不知道有什么方法可以从顶部引用这些节点。由于这些页面都在.NET Standard 2.0类库中,因此变得更加棘手,因此任何特定于平台的代码(例如VisualTreeHelper)都只能添加到UWP应用程序中,然后以某种方式抽象回到该共享UI库中。
[我知道这是一个非常具体的问题,可能很难回答,但是搜索我尝试做的任何部分似乎都能为我提供大量不相关的指南和信息。
我评估了在RadListView组件的UWP部分中创建'RightClicked'事件并将该通知提供给控件的XamarinForms部分的方法。从技术上讲,这是可能的,但是在编写应提供通知的UWP相关类时,此类是内部的。这意味着不可能使用UWP ListViewItems提供该通知。
因为,很可能您已经在XamarinForms中为RadListView设置了自定义ItemTemplate,因此可以考虑创建具有自定义渲染器的自定义XamrinForms控件(例如Grid,Frame,Border,Label ...)。 。该渲染器可以订阅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>
让我知道这是否适合您。
P.S。这种方法的一个优点是,您可以使用相同的渲染器来检索单击产生的位置。 XamarinForms仍然不支持此功能,您应该为每个平台创建类似的逻辑以获取该信息。