简体   繁体   English

如何根据 Xamarin Forms 中的当前页面广播消息

[英]How to Broadcast message based on the current Page in Xamarin Forms

I have a Xamarin Forms solution like this:我有一个 Xamarin Forms 解决方案,如下所示:

    Solution:
 |- Forms.App
 |   |- App.cs
 |   |- MyViewPage.xaml
 |   |- MyViewModel.cs
 |   | ...
 |   
 |- Droid Project
 |   |- TriggerService.cs
 |   | ...

I'm using a BroadcastReceiver with Intent filter in Android project to send Events when some physical trigger is pressed, so far this is working for me but now I'm trying to adapt that broadcast message to do different things based on from which page it was pressed.我在 Android 项目中使用 BroadcastReceiver 和 Intent 过滤器在按下某些物理触发器时发送事件,到目前为止这对我有用,但现在我正在尝试调整广播消息以根据它从哪个页面做不同的事情被按下。

It will be different to me to press a trigger from some Page than other, here is my current implementation on relevant classes:从某个页面按下触发器对我来说会有所不同,这是我当前在相关类上的实现:

Trigger Service触发服务

[BroadcastReceiver(Enabled = true, Exported = false)]
[IntentFilter(new[] { "android.TRIGGER" })]
public class TriggerService : BroadcastReceiver, ITriggerService
{
    public override void OnReceive(Context context, Intent intent)
    {
        //Here I need to identify the Page where I'm located
        var page = "MyViewPage" // should replace by some mechanism to GetCurrentPage();

        switch (page)
        {
            case "MyViewPage":
                Xamarin.Forms.MessagingCenter.Send<TriggerService>(this, "TRIGGER_MyViewPage");
                break;
            case "MyViewPage2":
                Xamarin.Forms.MessagingCenter.Send<TriggerService>(this, "TRIGGER_MyViewPage2");
                break;
            case "MyViewPage3":
                Xamarin.Forms.MessagingCenter.Send<TriggerService>(this, "TRIGGER_MyViewPage3");
                break;
        }
    }
}

Here MyViewPage这里我的视图页面

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class MyViewPage : ContentPage
{
    private MyViewModel _viewModel;

    public MyViewPage()
    { 
        InitializeComponent();
        _viewModel = new MyViewModel();
        MessagingCenter.Subscribe<TriggerService>(this, "TRIGGER_MyViewPage", (sender) =>
        {
            //Do something different for this Page when trigger pressed
        });
    }
}

To summarize I'm looking for a way to get the current Page from Android level when using Xamarin Forms, or maybe some orientation on a better way to implement such mechanism.总而言之,当使用 Xamarin Forms 时,我正在寻找一种从 Android 级别获取当前页面的方法,或者可能以更好的方式实现这种机制。

I resolved it inverting control and handling different behaviors at Forms layer instead of Android which I think is better solution.我解决了它在 Forms 层而不是 Android 层反转控制和处理不同的行为,我认为这是更好的解决方案。 I'll show below in case helps someone else:我将在下面显示以防对其他人有帮助:

Trigger Service (Broadcast):触发服务(广播):

[BroadcastReceiver(Enabled = true, Exported = false)]
[IntentFilter(new[] { "android.TRIGGER" })]
public class TriggerService : BroadcastReceiver, ITriggerService
{
    public override void OnReceive(Context context, Intent intent)
    {
        //I just broadcast the message no matter which page I'm in
        Xamarin.Forms.MessagingCenter.Send<TriggerService>(this, "TRIGGER");
    }
}

AppShell Class: AppShell Class:

public partial class AppShell : Xamarin.Forms.Shell
{
    public AppShell()
    {
        InitializeComponent();
        MessagingCenter.Subscribe<ITriggerService>(this, "TRIGGER", async (sender) =>
        {
            //Here I get the current page and do something different based on location
            var current = Shell.Current?.CurrentItem?.CurrentItem?.Route?.Replace("IMPL_","");
            if (current != null)
            {
                switch (current)
                {
                    case "MyViewPage":
                        CrossToastPopUp.Current.ShowToastMessage($"Trigger was pressed from: {current}");
                        break;
                    case "MyViewPage2":
                        CrossToastPopUp.Current.ShowToastMessage($"Trigger was pressed from: {current}");
                        break;
                    default:
                        break;
                }
            }    
        });
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM