Xamarin.Forms 中的 ActivityIndicator
ActivityIndicator in Xamarin.Forms
目前我正在处理一个项目,在该项目中我必须从一页 (page1) 导航到另一页 (page2)。由于 page2 需要很长时间才能加载,所以我想使用 ActivityIndicator
,但它根本没有效果。
请给我完整的代码来解决我的问题。
Page(1)
//code for tapping a label and to navigate to page2
void onpage1tapped(Object sender,EventArgs args)
{ label1.Opacity=0.5;
Device.StartTimer(TimeSpan.FromMilliseconds(100),()=>{label1.Opacity=1;return false; })
This.Navigate.PushAsync(new Page2());
}
Page(2)
//constructor for page2
public page2
{ InitializeComponent();
ActivityIndicator indicator=new ActivityIndicator{HorizontalOptions=LayoutOptions.CenterAndExpand,Color=Color.Black,IsVisible=false};
StackLayout stk=new StackLayout();
stk.Children.Add(indicator);
//Enabling activityindicator
indicator.IsRunning=true;
indicator.IsVisible=true;
//Below long time taking task
Assembly assembly = GetType().GetTypeInfo().Assembly;
string resource = String.Format("ks.texts.BST.txt");
//string resource = "advjava.texts.insertion.txt";
using (Stream s = assembly.GetManifestResourceStream(resource))
{
using (StreamReader sr = new StreamReader(s))
{
string line;
while (null != (line = sr.ReadLine()))
{
Label l = new Label { Text = line, TextColor = Color.FromRgb(110, 139, 69), FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)) };
stk.Children.Add(l);
}
}
}
//Disabling Activity indicator as the long task is complete
indicator.IsVisible=false;
indicator.IsRunning=false;
}
这只是一个示例代码,但它的逻辑是正确的,对我来说相当不错。 :)
var indicator = new ActivityIndicator() {
HorizontalOptions = LayoutOptions.CenterAndExpand
};
indicator.SetBinding(ActivityIndicator.IsVisibleProperty, "IsBusy", BindingMode.OneWay);
indicator.SetBinding(ActivityIndicator.IsRunningProperty, "IsBusy", BindingMode.OneWay);
var button = new Button() {
HorizontalOptions = LayoutOptions.Fill,
Text = "BUTTON"
};
button.Clicked += (sender, e) => IsBusy = !IsBusy;
var root = new StackLayout() {
HorizontalOptions = LayoutOptions.FillAndExpand,
VerticalOptions = LayoutOptions.FillAndExpand,
Children = {
button,
indicator
}
};
Content = root;
您可以参考此 Link,它通过 ChaseFlorell.
对 Github 给出了明确的注释
工作样本:Github
使用Acr.XamForms.UserDialogs Package。看看它..希望它有帮助
Here 是关于如何实现 Acr.XamForms.UserDialogs..
希望对你有帮助
问题在于如何阅读您的代码。它会完成,然后执行,但是如果你使用 Task.Run,你将能够在单独的线程上 运行 并保持 activity 指示器亮起并 运行 显示您的页面正在加载,您的机器正忙。
void onpage1tapped(Object sender,EventArgs args) {
activityIndicator.IsVisible= true;
Task.Run( () => {
label1.Opacity=0.5;
Device.StartTimer(TimeSpan.FromMilliseconds(100),()= {
label1.Opacity=1;returnfalse;
})
This.Navigate.PushAsync(new Page2());
});
}
目前我正在处理一个项目,在该项目中我必须从一页 (page1) 导航到另一页 (page2)。由于 page2 需要很长时间才能加载,所以我想使用 ActivityIndicator
,但它根本没有效果。
请给我完整的代码来解决我的问题。
Page(1)
//code for tapping a label and to navigate to page2
void onpage1tapped(Object sender,EventArgs args)
{ label1.Opacity=0.5;
Device.StartTimer(TimeSpan.FromMilliseconds(100),()=>{label1.Opacity=1;return false; })
This.Navigate.PushAsync(new Page2());
}
Page(2)
//constructor for page2
public page2
{ InitializeComponent();
ActivityIndicator indicator=new ActivityIndicator{HorizontalOptions=LayoutOptions.CenterAndExpand,Color=Color.Black,IsVisible=false};
StackLayout stk=new StackLayout();
stk.Children.Add(indicator);
//Enabling activityindicator
indicator.IsRunning=true;
indicator.IsVisible=true;
//Below long time taking task
Assembly assembly = GetType().GetTypeInfo().Assembly;
string resource = String.Format("ks.texts.BST.txt");
//string resource = "advjava.texts.insertion.txt";
using (Stream s = assembly.GetManifestResourceStream(resource))
{
using (StreamReader sr = new StreamReader(s))
{
string line;
while (null != (line = sr.ReadLine()))
{
Label l = new Label { Text = line, TextColor = Color.FromRgb(110, 139, 69), FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)) };
stk.Children.Add(l);
}
}
}
//Disabling Activity indicator as the long task is complete
indicator.IsVisible=false;
indicator.IsRunning=false;
}
这只是一个示例代码,但它的逻辑是正确的,对我来说相当不错。 :)
var indicator = new ActivityIndicator() {
HorizontalOptions = LayoutOptions.CenterAndExpand
};
indicator.SetBinding(ActivityIndicator.IsVisibleProperty, "IsBusy", BindingMode.OneWay);
indicator.SetBinding(ActivityIndicator.IsRunningProperty, "IsBusy", BindingMode.OneWay);
var button = new Button() {
HorizontalOptions = LayoutOptions.Fill,
Text = "BUTTON"
};
button.Clicked += (sender, e) => IsBusy = !IsBusy;
var root = new StackLayout() {
HorizontalOptions = LayoutOptions.FillAndExpand,
VerticalOptions = LayoutOptions.FillAndExpand,
Children = {
button,
indicator
}
};
Content = root;
您可以参考此 Link,它通过 ChaseFlorell.
对 Github 给出了明确的注释工作样本:Github
使用Acr.XamForms.UserDialogs Package。看看它..希望它有帮助
Here 是关于如何实现 Acr.XamForms.UserDialogs.. 希望对你有帮助
问题在于如何阅读您的代码。它会完成,然后执行,但是如果你使用 Task.Run,你将能够在单独的线程上 运行 并保持 activity 指示器亮起并 运行 显示您的页面正在加载,您的机器正忙。
void onpage1tapped(Object sender,EventArgs args) {
activityIndicator.IsVisible= true;
Task.Run( () => {
label1.Opacity=0.5;
Device.StartTimer(TimeSpan.FromMilliseconds(100),()= {
label1.Opacity=1;returnfalse;
})
This.Navigate.PushAsync(new Page2());
});
}