仅订阅一个MessagingCenter即可发出多个警报

时间:2018-10-23 00:44:23

标签: xamarin xamarin.forms uwp xamarin.uwp messagingcenter

我正在开发一个示例,其中Messaging Center将状态消息从设备代码发送到我的视图模型而未耦合。此时,在尝试在View模型中使用之前,我使用了一条警报消息来通知事件。

为此,我在共享应用程序构造函数(App.xaml)中使用了静态视图实例,在视图构造函数中我为状态下标。

应用(共享)

public partial class App : Application
    {

        #region MasterDetailPage
        public static MasterDetailPage MDP;
        public static NavigationPage NAV = null;
        public static MainView _mainpage;
        #endregion

        public App ()
        {
            InitializeComponent();
            NAV = new NavigationPage(new StarterView()) { BarBackgroundColor = Color.FromHex("701424"), BarTextColor = Color.White }; ;
            MDP = new MasterDetailPage();
            MDP.BackgroundColor = Xamarin.Forms.Color.FromHex("701424");
            _mainpage = new MainView();
            MDP.Master = _mainpage;
            MDP.Detail = NAV;
            MainPage = MDP;
            MainPage.Title = "H2X";


        }

(查看共享的图片)

public MainView ()
        {
            InitializeComponent ();

            string a="Test";
            #region MessegeCenter

            MessagingCenter.Subscribe<string,string>("APP", "Message_Received", async (sender,arg) => 
            {
                string b = a;
                a = $"{arg}";
                await DisplayAlert("Atenção", a+b, "Ok");
            });
            #endregion

        }

在特定的平台代码(设备-UWP)中,我创建了一个计时器,该计时器在主页构造函数中指定的时间过后发送消息。

void dispatcherTimer_Tick(object sender, object e)
        {
            DateTimeOffset time = DateTimeOffset.Now;
            TimeSpan span = time - lastTime;
            lastTime = time;
            //Time since last tick should be very very close to Interval
            TimerLog.Text += timesTicked + "\t time since last tick: " + span.ToString() + "\n";
            timesTicked++;
            if (timesTicked > timesToTick)
            {                   
                MessagingCenter.Send<string,string>("APP","Message_Received","MR");
            }
        }

当我运行它时,打开了两次具有相同文本的警报消息,但是没有两个订阅。相同的文本为我提供了来自同一发送事件的信息。

问题出在哪里?与我的静态视图有关系吗?

提前谢谢

吉尔赫姆

1 个答案:

答案 0 :(得分:0)

始终退订MessagingCenter是一个好习惯。

MessagingCenter.Unsubscribe<string, string>(this, "Message_Received");

如果MessagingCenter订阅了两次,则将调用两次函数。