Хорошо, у меня есть базовая настройка MVC для моего приложения Windows Form.При запуске приложения я пытаюсь запустить экран-заставку в отдельном потоке, пока отображается экран-заставка, вызвать событие загрузки контроллера в мою статическую базу данных из модели и по завершении этого закрыть.всплеск и запустить основную форму.
Однако я пришел к выводу, что вы не можете вручную вызывать события из конструктора .... У кого-нибудь есть обходной путь для этого?
Вотмоя всплывающая форма
public partial class SplashScreen : Form
{
//Delegate for cross thread call to close
private delegate void CloseDelegate();
//The type of form to be displayed as the splash screen
static SplashScreen splashScreen = null;
public SplashScreen()
{
InitializeComponent();
}
// A static entry point to launch SplashScreen.
static private void ShowForm()
{
splashScreen = new SplashScreen();
Application.Run(splashScreen);
}
static public void ShowSplashScreen()
{
// Make sure it is only launched once.
if (splashScreen != null)
return;
Thread thread = new Thread(new ThreadStart(SplashScreen.ShowForm));
thread.IsBackground = true;
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
// A static method to close the SplashScreen
static public void CloseForm()
{
if (splashScreen != null)
{
splashScreen.Invoke(new CloseDelegate(SplashScreen.CloseFormInternal));
}
}
static private void CloseFormInternal()
{
splashScreen.Close();
splashScreen = null;
}
}
Вот что я делаю в своей основной форме
public partial class Map : Form, IMapView
{
// Dictionary to hold overlays
private static List<GMapOverlay> overlays = new List<GMapOverlay>();
// global variables to track status of buttons
private bool closedButtonStatus;
private bool titleButtonStatus;
/// <summary>
/// Fired upon starting application
/// </summary>
public event Action StartupEvent;
/// <summary>
/// view constructor
/// Creates a new real estate data map and loads in the county boundary data
/// </summary>
public Map()
{
SplashScreen.ShowSplashScreen();
StartupEvent?.Invoke();
SplashScreen.CloseForm();
closedButtonStatus = false;
titleButtonStatus = false;
InitializeComponent();
loadMap();
}
/// <summary>
/// Loads the map and centers it over the united states, with desired default size metrics
/// </summary>
private void loadMap()
{
// Initialize map:
gmap.MapProvider = GMap.NET.MapProviders.GoogleMapProvider.Instance;
GMap.NET.GMaps.Instance.Mode = GMap.NET.AccessMode.ServerOnly;
// Center map over the US
gmap.Position = new PointLatLng(40, -98);
this.Size = new Size(1360, 665);
this.MinimumSize = new Size(1000, 600);
}
Итак, событие, которое я пытаюсь вызвать, - это «StartupEvent» в конструкторе Map, однаконе сработает.