1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6 using System.Threading.Tasks;
7 using System.Windows;
8
9 namespace UI
10 {
11 public class Application
12 {
13 private static Application instance;
14
15 private System.Windows.Application application;
16
17 private Thread thread;
18
19 public String Name;
20
21 public IApplicationCallbacks callbacks;
22
23 public List<Window> Windows = new List<Window>();
24 public ApplicationMenu Menu = new ApplicationMenu();
25 public MainToolBar ToolBar = new MainToolBar();
26
27 private Application() : base()
28 {
29 thread = new Thread(() => RunApplication());
30 thread.SetApartmentState(ApartmentState.STA);
31 }
32
33 public static Application GetInstance()
34 {
35 if (instance == null)
36 {
37 instance = new Application();
38 GC.KeepAlive(instance);
39 }
40 return instance;
41 }
42
43 public Thread Start()
44 {
45 thread.Start();
46 return thread;
47 }
48
49 private void RunApplication()
50 {
51 application = new System.Windows.Application();
52
53 if(callbacks != null)
54 {
55 callbacks.OnStartup();
56 }
57 application.Run();
58 if(callbacks != null)
59 {
60 callbacks.OnExit();
61 }
62 }
63
64 public void AddWindow(Window window)
65 {
66 Windows.Add(window);
67 }
68
69 public void RemoveWindow(Window window)
70 {
71 Windows.Remove(window);
72 if (Windows.Count == 0)
73 {
74 application.Shutdown();
75 }
76 }
77 }
78
79 public class ResultExec<T>
80 {
81 public T Result;
82 public Func<T> Func;
83
84 public void Exec()
85 {
86 Result = Func.Invoke();
87 }
88 }
89
90 public class VoidExec
91 {
92 public Action Action;
93
94 public void Exec()
95 {
96 Action.Invoke();
97 }
98 }
99
100 public interface IApplicationCallbacks
101 {
102 void OnStartup();
103 void OnOpen();
104 void OnExit();
105 }
106 }
107