C# 显示警报前的活动指示器

C# 显示警报前的活动指示器,c#,xaml,xamarin,xamarin.forms,xamarin.android,C#,Xaml,Xamarin,Xamarin.forms,Xamarin.android,在我的Xamarin应用程序中,我有一个通过SMTP服务器发送电子邮件的内容页 单击“提交”按钮发送电子邮件时,应用程序只会等待。在此等待期间,我希望显示一个活动指示器或文本加载标签,以便用户在显示过程成功的DisplayAlert之前知道某些东西正在工作 出于这样或那样的原因,ActivityIndicator和标签文本不显示。 也许我做错了什么 XAML 考虑保持代码异步,不要使其阻塞UI,这是SmtpClient.Send会发生的情况 这是对提供的原始代码的重构,以允许非阻塞流 priva

在我的Xamarin应用程序中,我有一个通过SMTP服务器发送电子邮件的内容页

单击“提交”按钮发送电子邮件时,应用程序只会等待。在此等待期间,我希望显示一个活动指示器或文本加载标签,以便用户在显示过程成功的DisplayAlert之前知道某些东西正在工作

出于这样或那样的原因,ActivityIndicator和标签文本不显示。 也许我做错了什么

XAML


考虑保持代码异步,不要使其阻塞UI,这是
SmtpClient.Send会发生的情况

这是对提供的原始代码的重构,以允许非阻塞流

private async void Submit\u已单击(对象发送方,事件参数e){
试一试{
切换指示器(真);
等待SendEmailAsync();
切换指示器(假);
等待DisplayAlert(“成功”,“消息已发送。谢谢。”,“确定”);
myPop.IsVisible=false;
myPop.IsEnabled=false;
}捕获(例外情况除外){
等待DisplayAlert(“错误”,“出现问题。请重试”,“确定”);
Console.WriteLine(例如ToString());
}
}
专用无效切换指示器(布尔显示){
indicator.IsRunning=显示;
indicator.IsVisible=显示;
indicator.IsEnabled=显示;
load.IsVisible=show;
}
专用异步任务SendEmailAsync(){
MailMessage mail=新的MailMessage();
mail.From=新邮件地址(“email@domain.com");
mail.To.Add(“email@domain.com");
mail.Subject=“Subject”;
Body=user\u msg;
SmtpClient SmtpServer=新的SmtpClient(“smtp.sendgrid.net”);
SmtpServer.Port=25;
SmtpServer.Credentials=新的网络凭据(“用户名”、“密码”);
SmtpServer.EnableSsl=true;
ServicePointManager.ServerCertificateValidationCallback=委托(对象发送电子邮件、X509Certificate证书、X509Chain-chain、System.Net.Security.SslPolicyErrors SslPolicyErrors){
返回true;
};
等待SmtpServer.SendMailAsync(邮件);
}
虽然XAML看起来不错,但我也会假设标签和指示器的可见性最初是假的



SmtpServer
是否有
任务SendAsync
?此外,您是否尝试为此使用自定义渲染器,该渲染器与本机加载机制一起工作?通过忽略web服务器调用,尝试测试默认情况下这两个视图是否正常显示。@Nkosi是的,它是does@G.hakim自定义渲染器?我不确定我知道那是什么。我将搜索并阅读这篇文章。我真的很喜欢你的方法。看来我不能像您那样对SmtpServer使用SendAsync。要使用SendAsync,需要有多个重载。你有什么建议?该指标仍不稳定showing@OluwasayoBabalola检查更新。使用。谢谢。工作完美。我也有逻辑。该方法之前一直在运行,添加wait使其异步运行。对吗?@Oluwasayobalola没错。它将阻塞代码推送到另一个线程,以使UI保持响应。太好了。谢谢:)
<StackLayout x:Name="myPop" AbsoluteLayout.LayoutBounds="0, 0, 1, 1" 
            AbsoluteLayout.LayoutFlags="All" BackgroundColor="#C0808080" Padding="5">

    <ContentView x:Name="input_box_overlay" 
    AbsoluteLayout.LayoutBounds="0, 0, 1, 1" 
    AbsoluteLayout.LayoutFlags="All" 
    Padding="5">

        <StackLayout Padding="20" BackgroundColor="White" 
                     HorizontalOptions="Center" VerticalOptions="Center"
                     HeightRequest="230" WidthRequest="230">
            <Label Text="Enter suggestion" TextColor="Black" FontSize="Medium"/>

            <StackLayout Padding="0, 10, 0, 0">
                <Editor x:Name="user_text" HeightRequest="100" Keyboard="Chat" BackgroundColor="#f7f8f9"/>
            </StackLayout>

            <StackLayout HorizontalOptions="Center" VerticalOptions="Center">
                <Label Text="Submitting..." x:Name="load"/>
                <ActivityIndicator x:Name="indicator"/>
            </StackLayout>

            <StackLayout Orientation="Horizontal" VerticalOptions="EndAndExpand" HorizontalOptions="CenterAndExpand">
                <Button TextColor="White" Text="Cancel" Clicked="Cancel_Clicked" BackgroundColor="#C0808080"/>
                <Button TextColor="White" Text="Submit" Clicked="Submit_Clicked" BackgroundColor="#395368" />
            </StackLayout>


        </StackLayout>
    </ContentView>

</StackLayout>
private async void Submit_Clicked(object sender, EventArgs e)
{
    try
    {
       indicator.IsRunning = true;
       indicator.IsVisible = true;
       indicator.IsEnabled = true;
       load.IsVisible = true;

        MailMessage mail = new MailMessage();
        SmtpClient SmtpServer = new SmtpClient("smtp.sendgrid.net");
        mail.From = new MailAddress("email@domain.com");
        mail.To.Add("email@domain.com");
        mail.Subject = "Subject";
        mail.Body = user_msg;
        SmtpServer.Port = 25;
        SmtpServer.Credentials = new NetworkCredential("username", "password");
        SmtpServer.EnableSsl = true;
        ServicePointManager.ServerCertificateValidationCallback = delegate (object sendemail, X509Certificate certificate, X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
        {
            return true;
        };
        SmtpServer.SendCompleted += (s, ev) => {
            indicator.IsRunning = false;
            indicator.IsVisible = false;
            indicator.IsEnabled = false;
            load.IsVisible = false;
        };
        SmtpServer.Send(mail);                        


        await DisplayAlert("Success", "Message Sent. Thank you.", "Ok");

        myPop.IsVisible = false;
        myPop.IsEnabled = false;
    }
    catch (Exception ex)
    {
        await DisplayAlert("Error", "Something went wrong. Please try again.", "ok");
        Console.WriteLine(ex.ToString());
    }
}