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