Browse Source

Revert removal of Application.Initialize

pull/2442/head
Benedikt Schroeder 7 years ago
parent
commit
21eda0db12
  1. 2
      samples/BindingDemo/App.xaml.cs
  2. 2
      samples/ControlCatalog.NetCore/Program.cs
  3. 11
      samples/ControlCatalog/App.xaml.cs
  4. 2
      samples/PlatformSanityChecks/App.xaml.cs
  5. 2
      samples/Previewer/App.xaml.cs
  6. 2
      samples/RenderDemo/App.xaml.cs
  7. 2
      samples/VirtualizationDemo/App.xaml.cs
  8. 2
      samples/interop/Direct3DInteropSample/App.paml.cs
  9. 1
      src/Avalonia.Controls/AppBuilderBase.cs
  10. 104
      src/Avalonia.Controls/Application.cs
  11. 6
      src/Avalonia.Styling/Controls/ExitEventArgs.cs
  12. 25
      tests/Avalonia.Controls.UnitTests/ApplicationTests.cs
  13. 2
      tests/Avalonia.DesignerSupport.TestApp/App.xaml.cs

2
samples/BindingDemo/App.xaml.cs

@ -10,7 +10,7 @@ namespace BindingDemo
{
public class App : Application
{
protected override void OnStartup(StartupEventArgs e)
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}

2
samples/ControlCatalog.NetCore/Program.cs

@ -31,7 +31,7 @@ namespace ControlCatalog.NetCore
ThreadPool.QueueUserWorkItem(_ => ConsoleSilencer());
});
else
BuildAvaloniaApp().Start();
BuildAvaloniaApp().Start<MainWindow>();
}
/// <summary>

11
samples/ControlCatalog/App.xaml.cs

@ -1,22 +1,13 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace ControlCatalog
{
public class App : Application
{
protected override void OnStartup(StartupEventArgs e)
public override void Initialize()
{
base.OnStartup(e);
AvaloniaXamlLoader.Load(this);
var mainWindow = new MainWindow();
mainWindow.Show();
MainWindow = mainWindow;
}
}
}

2
samples/PlatformSanityChecks/App.xaml.cs

@ -6,7 +6,7 @@ namespace PlatformSanityChecks
{
public class App : Application
{
protected override void OnStartup(StartupEventArgs e)
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}

2
samples/Previewer/App.xaml.cs

@ -6,7 +6,7 @@ namespace Previewer
{
public class App : Application
{
protected override void OnStartup(StartupEventArgs e)
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}

2
samples/RenderDemo/App.xaml.cs

@ -11,7 +11,7 @@ namespace RenderDemo
{
public class App : Application
{
protected override void OnStartup(StartupEventArgs e)
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}

2
samples/VirtualizationDemo/App.xaml.cs

@ -9,7 +9,7 @@ namespace VirtualizationDemo
{
public class App : Application
{
protected override void OnStartup(StartupEventArgs e)
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}

2
samples/interop/Direct3DInteropSample/App.paml.cs

@ -6,7 +6,7 @@ namespace Direct3DInteropSample
{
public class App : Application
{
protected override void OnStartup(StartupEventArgs e)
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}

1
src/Avalonia.Controls/AppBuilderBase.cs

@ -311,6 +311,7 @@ namespace Avalonia.Controls
WindowingSubsystemInitializer();
RenderingSubsystemInitializer();
Instance.RegisterServices();
Instance.Initialize();
AfterSetupCallback(Self);
}
}

104
src/Avalonia.Controls/Application.cs

@ -43,8 +43,8 @@ namespace Avalonia
private readonly Styler _styler = new Styler();
private Styles _styles;
private IResourceDictionary _resources;
private CancellationTokenSource _mainLoopCancellationTokenSource;
private int _exitCode;
/// <summary>
/// Initializes a new instance of the <see cref="Application"/> class.
@ -201,53 +201,40 @@ namespace Avalonia
/// </value>
internal bool IsShuttingDown { get; private set; }
public void Run()
{
if (_mainLoopCancellationTokenSource != null)
{
throw new Exception("Run should only called once");
}
_mainLoopCancellationTokenSource = new CancellationTokenSource();
Dispatcher.UIThread.Post(() => OnStartup(new StartupEventArgs()), DispatcherPriority.Send);
/// <summary>
/// Initializes the application by loading XAML etc.
/// </summary>
public virtual void Initialize() { }
Run(_mainLoopCancellationTokenSource.Token);
public int Run()
{
return Run(new CancellationTokenSource());
}
/// <summary>
/// Runs the application's main loop until the <see cref="ICloseable"/> is closed.
/// </summary>
/// <param name="closable">The closable to track</param>
public void Run(ICloseable closable)
public int Run(ICloseable closable)
{
if (_mainLoopCancellationTokenSource != null)
{
throw new Exception("Run should only called once");
}
_mainLoopCancellationTokenSource = new CancellationTokenSource();
closable.Closed += (s, e) => _mainLoopCancellationTokenSource?.Cancel();
Run(_mainLoopCancellationTokenSource.Token);
return Run(new CancellationTokenSource());
}
/// <summary>
/// Runs the application's main loop until some condition occurs that is specified by ExitMode.
/// </summary>
/// <param name="mainWindow">The main window</param>
public void Run(Window mainWindow)
public int Run(Window mainWindow)
{
if (_mainLoopCancellationTokenSource != null)
Dispatcher.UIThread.Post(() =>
{
throw new Exception("Run should only called once");
}
_mainLoopCancellationTokenSource = new CancellationTokenSource();
if (MainWindow != null)
{
return;
}
if (MainWindow == null)
{
if (mainWindow == null)
{
throw new ArgumentNullException(nameof(mainWindow));
@ -259,20 +246,44 @@ namespace Avalonia
}
MainWindow = mainWindow;
}
});
Run(_mainLoopCancellationTokenSource.Token);
return Run(new CancellationTokenSource());
}
/// <summary>
/// Runs the application's main loop until the <see cref="CancellationToken"/> is canceled.
/// </summary>
/// <param name="token">The token to track</param>
public void Run(CancellationToken token)
public int Run(CancellationToken token)
{
Dispatcher.UIThread.MainLoop(token);
return Run(CancellationTokenSource.CreateLinkedTokenSource(token));
}
Shutdown();
private int Run(CancellationTokenSource tokenSource)
{
if (IsShuttingDown)
{
throw new InvalidOperationException("Application is shutting down.");
}
if (_mainLoopCancellationTokenSource != null)
{
throw new InvalidOperationException("Application is already running.");
}
_mainLoopCancellationTokenSource = tokenSource;
Dispatcher.UIThread.Post(() => OnStartup(new StartupEventArgs()), DispatcherPriority.Send);
Dispatcher.UIThread.MainLoop(_mainLoopCancellationTokenSource.Token);
if (!IsShuttingDown)
{
Shutdown(_exitCode);
}
return _exitCode;
}
protected virtual void OnStartup(StartupEventArgs e)
@ -296,16 +307,33 @@ namespace Avalonia
{
if (IsShuttingDown)
{
return;
throw new InvalidOperationException("Application is already shutting down.");
}
IsShuttingDown = true;
_exitCode = exitCode;
IsShuttingDown = true;
Windows.Clear();
OnExit(new ExitEventArgs { ApplicationExitCode = exitCode });
try
{
var e = new ExitEventArgs { ApplicationExitCode = _exitCode };
OnExit(e);
_mainLoopCancellationTokenSource?.Cancel();
_exitCode = e.ApplicationExitCode;
Environment.ExitCode = _exitCode;
}
finally
{
_mainLoopCancellationTokenSource?.Cancel();
_mainLoopCancellationTokenSource = null;
IsShuttingDown = false;
}
}
/// <inheritdoc/>

6
src/Avalonia.Styling/Controls/ExitEventArgs.cs

@ -7,10 +7,6 @@ namespace Avalonia.Controls
{
public class ExitEventArgs : EventArgs
{
public int ApplicationExitCode
{
get => Environment.ExitCode;
set => Environment.ExitCode = value;
}
public int ApplicationExitCode { get; set; }
}
}

25
tests/Avalonia.Controls.UnitTests/ApplicationTests.cs

@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using Avalonia.Threading;
using Avalonia.UnitTests;
using Xunit;
@ -129,5 +130,29 @@ namespace Avalonia.Controls.UnitTests
Assert.True(raised);
}
}
[Fact]
public void Throws_InvalidOperationException_On_Run_When_Application_Is_Already_Running()
{
using (UnitTestApplication.Start(TestServices.MockThreadingInterface))
{
Application.Current.Run();
Assert.Throws<InvalidOperationException>(() => { Application.Current.Run(); });
}
}
[Fact]
public void Should_Set_ExitCode_After_Shutdown()
{
using (UnitTestApplication.Start(TestServices.MockThreadingInterface))
{
Application.Current.Shutdown(1337);
var exitCode = Application.Current.Run();
Assert.Equal(1337, exitCode);
}
}
}
}

2
tests/Avalonia.DesignerSupport.TestApp/App.xaml.cs

@ -5,7 +5,7 @@ namespace Avalonia.DesignerSupport.TestApp
{
public class App : Application
{
protected override void OnStartup(StartupEventArgs e)
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}

Loading…
Cancel
Save