如何在屏幕中间显示 ActivityIndicator?
How to show ActivityIndicator in the middle of the screen?
我创建了一个 activity 指示器并将其添加到 StackLayout,当我创建它时 运行,它在模拟器中显示在右上角 Android 4.4 和iOS 没有显示并且在 Android 6 phone 中没有显示。
var indicator = new ActivityIndicator()
{
Color = Color.Blue,
};
indicator.SetBinding(ActivityIndicator.IsVisibleProperty, "IsBusy", BindingMode.OneWay);
indicator.SetBinding(ActivityIndicator.IsRunningProperty, "IsBusy", BindingMode.OneWay);
AbsoluteLayout.SetLayoutFlags(indicator, AbsoluteLayoutFlags.PositionProportional);
AbsoluteLayout.SetLayoutBounds(indicator, new Rectangle(0.5, 0.5, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize));
mainLayout.Children.Add(indicator);
我想将 activity 指示器显示在屏幕中央,因为该操作需要一些时间才能完成。
您将 activity 指示器添加到堆栈布局,但您正在设置绝对布局 LayoutFlags,它们将不起作用。
为了能够实现你想要的,你需要糟糕的结构
AbsoluteLayout
StackLayout
ActivityIndicator
mainLayout应该是AbsoluteLayout,所有内容都应该包含在嵌套的StackLayout中。
您在状态栏中看到的指示器是基本页面 class IsBusy
属性 的默认行为。您的代码不起作用的原因是因为您试图将 ActivityIndicator
的可见性绑定到 属性 - 但您没有指定绑定源。如果您查看调试器的应用程序输出日志,那么您可能会看到类似 "Property 'IsBusy' not found on type 'Object'".
的消息
要修复它,您只需将每个绑定的绑定上下文指向表单。试一试:
public partial class App : Application
{
public App ()
{
var mainLayout = new AbsoluteLayout ();
MainPage = new ContentPage {
Content = mainLayout
};
var containerPage = Application.Current.MainPage;
var indicator = new ActivityIndicator() {
Color = Color.Blue,
};
indicator.SetBinding(VisualElement.IsVisibleProperty, new Binding("IsBusy", BindingMode.OneWay, source: containerPage));
indicator.SetBinding(ActivityIndicator.IsRunningProperty, new Binding("IsBusy", BindingMode.OneWay, source: containerPage));
AbsoluteLayout.SetLayoutFlags(indicator, AbsoluteLayoutFlags.PositionProportional);
AbsoluteLayout.SetLayoutBounds(indicator, new Rectangle(0.5, 0.5, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize));
mainLayout.Children.Add(indicator);
containerPage.IsBusy = true;
}
}
我创建了一个 activity 指示器并将其添加到 StackLayout,当我创建它时 运行,它在模拟器中显示在右上角 Android 4.4 和iOS 没有显示并且在 Android 6 phone 中没有显示。
var indicator = new ActivityIndicator()
{
Color = Color.Blue,
};
indicator.SetBinding(ActivityIndicator.IsVisibleProperty, "IsBusy", BindingMode.OneWay);
indicator.SetBinding(ActivityIndicator.IsRunningProperty, "IsBusy", BindingMode.OneWay);
AbsoluteLayout.SetLayoutFlags(indicator, AbsoluteLayoutFlags.PositionProportional);
AbsoluteLayout.SetLayoutBounds(indicator, new Rectangle(0.5, 0.5, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize));
mainLayout.Children.Add(indicator);
我想将 activity 指示器显示在屏幕中央,因为该操作需要一些时间才能完成。
您将 activity 指示器添加到堆栈布局,但您正在设置绝对布局 LayoutFlags,它们将不起作用。
为了能够实现你想要的,你需要糟糕的结构
AbsoluteLayout
StackLayout
ActivityIndicator
mainLayout应该是AbsoluteLayout,所有内容都应该包含在嵌套的StackLayout中。
您在状态栏中看到的指示器是基本页面 class IsBusy
属性 的默认行为。您的代码不起作用的原因是因为您试图将 ActivityIndicator
的可见性绑定到 属性 - 但您没有指定绑定源。如果您查看调试器的应用程序输出日志,那么您可能会看到类似 "Property 'IsBusy' not found on type 'Object'".
要修复它,您只需将每个绑定的绑定上下文指向表单。试一试:
public partial class App : Application
{
public App ()
{
var mainLayout = new AbsoluteLayout ();
MainPage = new ContentPage {
Content = mainLayout
};
var containerPage = Application.Current.MainPage;
var indicator = new ActivityIndicator() {
Color = Color.Blue,
};
indicator.SetBinding(VisualElement.IsVisibleProperty, new Binding("IsBusy", BindingMode.OneWay, source: containerPage));
indicator.SetBinding(ActivityIndicator.IsRunningProperty, new Binding("IsBusy", BindingMode.OneWay, source: containerPage));
AbsoluteLayout.SetLayoutFlags(indicator, AbsoluteLayoutFlags.PositionProportional);
AbsoluteLayout.SetLayoutBounds(indicator, new Rectangle(0.5, 0.5, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize));
mainLayout.Children.Add(indicator);
containerPage.IsBusy = true;
}
}