这是可以在您的 PCL 和 Android 项目中使用的代码,遗憾的是我目前还没有编写 iOS 自定义渲染器。无论如何,您需要在您的 PCL 中自定义 NavigationPage,并在您的 Android 项目中自定义 NavigationPageRenderer:
CustomNavigationPage.cs(在您的 PCL 项目中):
public class CustomNavigationPage : NavigationPage
{
public event EventHandler<EventArgs> OnShowActivityIndicator;
public event EventHandler<EventArgs> OnHideActivityIndicator;
}
CustomNavigationPageRenderer.cs(在您的 Android 项目中):
[assembly: ExportRenderer(typeof(CustomNavigationPage), typeof(CustomNavigationPageRenderer))]
namespace MyProject.Droid.CustomRenderers
{
CustomNavigationPage page;
Android.Support.V7.Widget.Toolbar _toolbar;
Android.Widget.ProgressBar _progressBar;
bool _isProgressBarCurrentlyOnToolBar = false;
public class CustomNavigationPageRenderer : NavigationPageRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<CustomNavigationPage> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
page = (CustomNavigationPage)e.NewElement;
page.OnShowActivityIndicator += HandleShowActivityIndicator;
page.OnHideActivityIndicator += HandleHideActivityIndicator;
}
}
private void HandleShowActivityIndicator(object sender, EventArgs e)
{
var progressBar = GetProgressBar();
if (progressBar == null)
return;
var toolbar = GetToolbar();
if (toolbar == null)
return;
Device.BeginInvokeOnMainThread(() =>
{
if (_isProgressBarCurrentlyOnToolBar == false)
{
toolbar.AddView(progressBar);
_isProgressBarCurrentlyOnToolBar = true;
}
});
}
private void HandleHideActivityIndicator(object sender, EventArgs e)
{
var progressBar = GetProgressBar();
if (progressBar == null)
return;
var toolbar = GetToolbar();
if (toolbar == null)
return;
Device.BeginInvokeOnMainThread(() =>
{
if (_isProgressBarCurrentlyOnToolBar)
{
toolbar.RemoveView(progressBar);
_isProgressBarCurrentlyOnToolBar = false;
}
});
}
private Android.Support.V7.Widget.Toolbar GetToolbar()
{
if (_toolbar == null)
{
for (var i = 0; i < this.ChildCount; i++)
{
var child = GetChildAt(i);
if (child.GetType() == typeof(Android.Support.V7.Widget.Toolbar))
{
_toolbar = (Android.Support.V7.Widget.Toolbar)child;
}
}
}
return _toolbar;
}
private Android.Widget.ProgressBar GetProgressBar()
{
if (_progressBar == null)
{
_progressBar = new Android.Widget.ProgressBar(Xamarin.Forms.Forms.Context)
{
Indeterminate = true,
LayoutParameters = new LayoutParams(Utils.PxToDip(20), Utils.PxToDip(20))
};
_progressBar.SetPadding(10, 0, 0, 0);
}
return _progressBar;
}
}
}
使用它很简单,在你的代码后面简单地调用事件处理程序。即:
public class MyPage : CustomNavigationPage
{
public MyPage()
{
// show it:
OnShowActivityIndicator?.Invoke(this, null);
// hide it:
OnHideActivityIndicator?.Invoke(this, null);
}
}