C# Xamarin forms DisplayAlert在从委托调用的函数调用时不显示

C# Xamarin forms DisplayAlert在从委托调用的函数调用时不显示,c#,android,ios,xamarin,delegates,C#,Android,Ios,Xamarin,Delegates,当我从内部调用Greet时,size函数DisplayAlert会按预期显示一个警报,但是当在事件发生后从代理调用该警报时,它会以正确的名称(Greet已被调用)记录到输出,但DisplayAlert不会显示 public class CustomPage : ContentPage { ... protected override void OnValidSizeAllocated(double width, double height)

当我从内部调用Greet时,size函数DisplayAlert会按预期显示一个警报,但是当在事件发生后从代理调用该警报时,它会以正确的名称(Greet已被调用)记录到输出,但DisplayAlert不会显示

   public class CustomPage : ContentPage
   {
         ...

        protected override void OnValidSizeAllocated(double width, double height)
        {
            ...

            Greet("Test");

            app.FB.GetName();

            app.FB.NameRecieved += (s,e) =>
            {
                Greet(e.Name);  
            };

        }

        public void Greet(string name)
        {
            Utils.Log("Hey " + name);
            DisplayAlert("Hey " + name, "Welcome", "OK");
        }

    }

上面的代码输出“Hey Test”,然后出现一个警报,说“Hey Test,Welcome”,并按OK按钮,然后输出“Hey Leo”(这是正确的,因为这是来自Facebook帐户的名称),但没有显示警报。

在GetName函数中是否触发了NameReceived

也许您需要将app.FB.GetName()放在“+={…};”块之后

如果nameReceived被正确触发,则可能Greet未在ui线程上运行, 尝试将显示代码包装到

Device.BeginInvokeOnMainThread (() => {
 DisplayAlert("Hey " + name, "Welcome", "OK");
});

如前所述,为什么不创建一个实现
DisplayAlert
PageBase
类,并将其包装在
BeingInvokeMainThread
中,这样就不必继续重新编写它:

public class PageBase : ContentPage
{        
    public void DisplayAlert(string message,string title, string button)
    {
         Device.BeginInvokeOnMainThread (() => {
              DisplayAlert(message, title, button);
              });
    }

}

您(可能)需要强制DisplayAlert在UI线程上运行。尝试使用Device.BeginInvokeOnMainThread()谢谢Mauro,这很有效!NameReceived在GetName中被激发,尽管它以任意顺序与代码一起工作(可能激发的事件有延迟?),但我应该首先订阅该事件,这是对的。在将我的显示代码包装到UI线程中之后,一切正常,我对多线程有点陌生,所以我没有想到它。干杯,利奥。好主意!如果我需要多个显示警报,这将使它变得更简单。