20

Xamarin.Forms 是非常新且非常令人兴奋的,但现在我看到它的文档有限且示例很少。我正在尝试制作一个界面类似于“MasterDetailPage”的应用程序,但也有一个右侧的 Flyout 视图,而不仅仅是左侧的。

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

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

对于 iOS,这是可行的,但对于 Android,活动上的触摸侦听器似乎不起作用。

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

4

3 回答 3

1

对于 Xamarin.Forms 滑动手势识别器添加 SwipeGestureRecognizer

<BoxView Color="Teal" ...>
<BoxView.GestureRecognizers>
    <SwipeGestureRecognizer Direction="Left" Swiped="OnSwiped"/>
</BoxView.GestureRecognizers>
</BoxView>

这是等效的 C# 代码:

var boxView = new BoxView { Color = Color.Teal, ... };
var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Left };
leftSwipeGesture.Swiped += OnSwiped;

boxView.GestureRecognizers.Add(leftSwipeGesture);

如需更多信息,请点击此处:https ://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/gestures/swipe

于 2019-03-20T09:16:32.150 回答
0

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

元素:

public class LRMasterDetailPage {
    public View LeftDetail;
    public View RightDetail;
    public View Master;
}

渲染器:

[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
        }
    }
}
于 2014-07-26T11:38:12.590 回答
0

我建议您使用 CarouselView 方法,因为您可以使用现有的支持滑动手势的轮播视图解决方案。因此,您的视图将被包装到此轮播视图控件中

于 2017-06-01T09:54:33.253 回答