Xamarin.Forms轻扫手势识别器

Dan*_*iel 19 xaml android xamarin xamarin.forms

Xamarin.Forms是非常新的,非常令人兴奋,但是现在我看到它有限的文档和一些样本.我正在尝试使用类似于"MasterDetailPage"的界面创建一个应用程序,但也有一个正确的Flyout视图,而不仅仅是左侧视图.

我已经看到使用当前的API是不可能的,所以我的方法是这样的:

  1. 创建一个共享的GestureRecognizer接口.
  2. 在Android应用程序和iOS中将此接口绑定到iOS上的UIGestureRecognizer或android上的OnTouch方法.

对于iOS,这是有效的,但对于Android,触摸监听器对活动似乎不起作用.

我的做法好吗?也许还有另一种直接从共享代码捕获触摸事件的好方法?或者你有任何想法为什么公共覆盖bool OnTouchEvent在AndroidActivity中不起作用?

Her*_*man 0

MasterDetailPage 和其他共享元素只是视图渲染器拾取的容器。您最好的选择是创建一个自定义 LRMasterDetailPage(左-右..)并为其指定 DetailLeft 和 DetailRight 的属性。然后,您为每个平台为此自定义元素实现一个自定义 ViewRenderer。

元素:

public class LRMasterDetailPage {
    public View LeftDetail;
    public View RightDetail;
    public View Master;
}
Run Code Online (Sandbox Code Playgroud)

渲染器:

[assembly:ExportRenderer (typeof(LRMasterDetailPage), typeof(LRMDPRenderer))]
namespace App.iOS.Renderers
{
    public class LRMDPRenderer : ViewRenderer<LRMasterDetailPage,UIView>
    {
        LRMasterDetailPage element;

        protected override void OnElementChanged (ElementChangedEventArgs<LRMasterDetailPage> e)
        {
            base.OnElementChanged (e);
            element = e.NewElement;
            // Do someting else, init for example
        }

        protected override void OnElementPropertyChanged (object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "Renderer")
                    return;
            base.OnElementPropertyChanged (sender, e);

            if (e.PropertyName == "LeftDetail")
                updateLeft();

            if (e.PropertyName == "RightDetail")
                updateRight();
        }

        private void updateLeft(){
            // Insert view of DetailLeft element into subview
            // Add button to open Detail to parent navbar, if not yet there
            // Add gesture recognizer for left swipe
        }
        private void updateRight(){
            // same as for left, but flipped
        }
    }
}
Run Code Online (Sandbox Code Playgroud)