События запуска / Загрузка данных при инициализации формы Windows (MVC) - PullRequest
0 голосов
/ 29 мая 2019

Хорошо, у меня есть базовая настройка 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, однаконе сработает.

1 Ответ

0 голосов
/ 05 июня 2019

Можно установить свойство непрозрачности основных форм на 0%.

Когда вы запускаете вашу программу, запускается основная форма, но она не отображается.

Затем вы можете отобразить заставку из события первичной формы, что-то вроде события «Загрузка». Вы также можете запустить загрузку базы данных и т. Д.

После того, как вы выполнили необходимую для запуска обработку, вы можете выключить форму заставки и установить непрозрачность своей основной формы на 100%, что сделает ее видимой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...