c# - Xamarin.Forms - 应用程序级别的全局点击事件

标签 c# xamarin xamarin.forms xamarin.android

如何在 Xamarin.Forms 应用程序中拦截应用程序级别的点击/单击事件?

我尝试在 MainPage 上使用类似的东西

    <Grid.GestureRecognizers>
        <TapGestureRecognizer Command="{Binding TappedCommand}" Tapped="TapGestureRecognizer_OnTapped"></TapGestureRecognizer>
    </Grid.GestureRecognizers>

但它仅在我点击空白区域时有效,触摸按钮不会触发事件。

此外,我经常通过更改 MainPage 进行导航,因此即使它有效,我也必须添加这样的识别器。

我想在我的应用程序中全局处理任何触摸/点击/点击事件,在 Xamarin.Forms 中是否可行?

最佳答案

这可以在特定于平台的应用程序中轻松设置,然后使用 Xamarin.Forms 依赖服务订阅/取消订阅事件。

您在这些事件中捕获的内容取决于您的需要,在本示例中,我只是捕获 x/y 值并将其事件化。

一个通用的 EventArgs 类和 DP 接口(interface):

public class TouchEventArgs<T> : EventArgs
{
    public T EventData { get; private set; }

    public TouchEventArgs(T EventData)
    {
        this.EventData = EventData;
    }
}

public interface IGlobalTouch
{
    void Subscribe(EventHandler handler);
    void Unsubscribe(EventHandler handler);
}

将以下内容添加到 Xamarin.Android 应用程序的 MainActivity 中:

public EventHandler globalTouchHandler;
public override bool DispatchTouchEvent(MotionEvent ev)
{
    globalTouchHandler?.Invoke(null, new TouchEventArgs<Point>(new Point(ev.GetX(), ev.GetY())));
    return base.DispatchTouchEvent(ev);
}

Android 依赖实现:

public class GlobalTouch : IGlobalTouch
{
    public GlobalTouch() {}

    public void Subscribe(EventHandler handler)
    {
        (Forms.Context as MainActivity).globalTouchHandler += handler;
    }

    public void Unsubscribe(EventHandler handler)
    {
        (Forms.Context as MainActivity).globalTouchHandler -= handler;
    }
}

在 Xamarin.Forms 项目中的用法:

DependencyService.Get<IGlobalTouch>().Subscribe((sender, e) =>
{
    var point = (e as TouchEventArgs<Point>).EventData;
    System.Diagnostics.Debug.WriteLine($"{point.X}:{point.Y}");
});

注意:您应该分配一个代表,这样才能取消订阅...

输出:

307.628997802734:365.563842773438
309.280151367188:365.197265625
311.883605957031:365.390991210938
312.694641113281:380.148590087891
308.030578613281:387.823364257813
291.513244628906:396.339416503906
286.220489501953:396.339416503906
282.100006103516:396.339416503906

iOS 也可以使用相同的技术,有 TouchesBeganTouchesEndedTouchesMovedTouchesCancelled您可以根据需要附加....

关于c# - Xamarin.Forms - 应用程序级别的全局点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41215689/

相关文章:

c# - 通过与不同对象的另一个列表进行比较来过滤对象列表

c# - Resharper:有没有办法修改清理代码/更新文件头的行为?

c# - : Azure service client and device client 之间的区别

xamarin - 水平 ScrollView - xamarin.forms

c# - ThreadPoolConsumerPool 中的 MassTransit NullReferenceException

c# - 如何将字典对象列表绑定(bind)到数据源集合?

android - 如何为不同大小的 Android 创建 UI

c# - 为什么 PCL NuGet 包无法定位 Xamarin 平台?

c# - ActivityIndi​​cator 未在绑定(bind)到 ViewModel 的 XAML 中显示

c# - 任务不包含内容的定义