我有一个非常简单的问题,但我找不到任何答案。
我有一个应用程序,我希望每次发生平移/滑动/滑动手势时都会调用一个函数。
我知道布局是如何组织的,所以这意味着我无法在主布局上添加手势,但与此同时,将此手势添加到每个元素似乎令人毛骨悚然...
有什么想法吗?
感谢
答案 0 :(得分:0)
制作自定义页面渲染器并在那里添加手势。
这是iOS上的一个例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Foundation;
using UIKit;
using Xamarin.Forms.Platform.iOS;
using Xamarin.Forms;
using Knok;
using Knok.iOS;
[assembly: ExportRenderer(typeof(SearchEventsPage), typeof(SearchEventsPageRenderer))]
namespace Knok.iOS
{
class SearchEventsPageRenderer : PageRenderer
{
UISwipeGestureRecognizer swipeLeftGestureRecognizer, swipeRightGestureRecognizer;
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
if (swipeLeftGestureRecognizer != null)
NativeView.RemoveGestureRecognizer(swipeLeftGestureRecognizer);
if (swipeRightGestureRecognizer != null)
NativeView.RemoveGestureRecognizer(swipeRightGestureRecognizer);
}
if (e.NewElement != null)
{
swipeLeftGestureRecognizer = new UISwipeGestureRecognizer(_ =>
{
((SearchEventsPage)Element).OnSwipeLeft();
})
{
Direction = UISwipeGestureRecognizerDirection.Left
};
NativeView.AddGestureRecognizer(swipeLeftGestureRecognizer);
swipeRightGestureRecognizer = new UISwipeGestureRecognizer(() =>
{
((SearchEventsPage)Element).OnSwipeRight();
})
{
Direction = UISwipeGestureRecognizerDirection.Right
};
NativeView.AddGestureRecognizer(swipeRightGestureRecognizer);
}
}
}
}
其中OnSwipeLeft和OnSwipeRight在SearchEventsPage中定义为
public async void OnSwipeLeft()
{
}
答案 1 :(得分:0)
我找到了一些不那么糟糕的东西,它也可以引发一个事件或调用给定的Action<>
public class PanContainer : ContentView
{
private double x, y;
public PanContainer()
{
var panGesture = new PanGestureRecognizer();
panGesture.PanUpdated += OnPanUpdated;
GestureRecognizers.Add(panGesture);
BackgroundColor = Color.Transparent;
}
private double valueX;
private double valueY;
private void OnPanUpdated(object sender, PanUpdatedEventArgs e)
{
if (e.TotalX == 0 && e.TotalX != valueX)
Debug.WriteLine("The X pan value is [{0}]", valueX);
valueX = e.TotalX;
if (e.TotalY == 0 && e.TotalY != valueX)
Debug.WriteLine("The Y pan value is [{0}]", valueY);
valueY = e.TotalY;
}
}
就像使用它一样
<ContentPage.Content>
<AbsoluteLayout BackgroundColor="Black">
<component:PanContainer AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1" AbsoluteLayout.LayoutFlags="All">
</component:PanContainer>
</AbsoluteLayout>
</ContentPage.Content>
并且不要忘记包含xmlns:component="clr-namespace:NAMESPACE.Sources.Components;assembly=NightLine"
如果您想举办活动或致电某项活动,请从private void OnPanUpdated(object sender, PanUpdatedEventArgs e) { .. }