using System;
using System.Collections.Generic;
using System.Reflection;
using System.Linq;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Platform;
namespace Avalonia.Controls
{
///
/// Base class for initializing platform-specific services for an .
///
/// The type of the AppBuilder class itself.
public abstract class AppBuilderBase where TAppBuilder : AppBuilderBase, new()
{
private static bool s_setupWasAlreadyCalled;
private Action _optionsInitializers;
private Func _appFactory;
private IApplicationLifetime _lifetime;
///
/// Gets or sets the instance.
///
public IRuntimePlatform RuntimePlatform { get; set; }
///
/// Gets or sets a method to call the initialize the runtime platform services (e. g. AssetLoader)
///
public Action RuntimePlatformServicesInitializer { get; private set; }
///
/// Gets the instance being initialized.
///
public Application Instance { get; private set; }
///
/// Gets the type of the Instance (even if it's not created yet)
///
public Type ApplicationType { get; private set; }
///
/// Gets or sets a method to call the initialize the windowing subsystem.
///
public Action WindowingSubsystemInitializer { get; private set; }
///
/// Gets the name of the currently selected windowing subsystem.
///
public string WindowingSubsystemName { get; private set; }
///
/// Gets or sets a method to call the initialize the windowing subsystem.
///
public Action RenderingSubsystemInitializer { get; private set; }
///
/// Gets the name of the currently selected rendering subsystem.
///
public string RenderingSubsystemName { get; private set; }
///
/// Gets or sets a method to call after the is setup.
///
public Action AfterSetupCallback { get; private set; } = builder => { };
public Action AfterPlatformServicesSetupCallback { get; private set; } = builder => { };
protected AppBuilderBase(IRuntimePlatform platform, Action platformServices)
{
RuntimePlatform = platform;
RuntimePlatformServicesInitializer = () => platformServices((TAppBuilder)this);
}
///
/// Begin configuring an .
///
/// The subclass of to configure.
/// An instance.
public static TAppBuilder Configure()
where TApp : Application, new()
{
return new TAppBuilder()
{
ApplicationType = typeof(TApp),
// Needed for CoreRT compatibility
_appFactory = () => new TApp()
};
}
///
/// Begin configuring an .
///
/// Factory function for .
/// The subclass of to configure.
/// is useful for passing of dependencies to .
/// An instance.
public static TAppBuilder Configure(Func appFactory)
where TApp : Application
{
return new TAppBuilder()
{
ApplicationType = typeof(TApp),
_appFactory = appFactory
};
}
protected TAppBuilder Self => (TAppBuilder)this;
public TAppBuilder AfterSetup(Action callback)
{
AfterSetupCallback = (Action)Delegate.Combine(AfterSetupCallback, callback);
return Self;
}
public TAppBuilder AfterPlatformServicesSetup(Action callback)
{
AfterPlatformServicesSetupCallback = (Action)Delegate.Combine(AfterPlatformServicesSetupCallback, callback);
return Self;
}
///
/// Starts the application with an instance of .
///
/// The window type.
/// A delegate that will be called to create a data context for the window (optional).
[Obsolete("Use either lifetimes or AppMain overload. See see https://github.com/AvaloniaUI/Avalonia/wiki/Application-lifetimes for details")]
public void Start(Func