代码之家  ›  专栏  ›  技术社区  ›  Jader Dias

如何防止WPF应用程序加载?

  •  5
  • Jader Dias  · 技术社区  · 14 年前

    我希望WPF应用程序只在某些条件下启动。我尝试了以下方法但没有成功:

    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            if (ConditionIsMet) // pseudo-code
            {
                base.OnStartup(e);
            }
        }
    }
    

    但即使不符合条件,应用程序也能正常运行

    3 回复  |  直到 14 年前
        1
  •  14
  •   Sergey Vyacheslavovich Brunov prodigitalson    8 年前

    试试这个:

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        if (MyCondition)
        {
            ShowSomeDialog("Hey, I Can't start because...");
            this.Shutdown();
        }
    }
    
        2
  •  3
  •   Jader Dias    14 年前

    另一个解决方案

    <Application x:Class="SingleInstanceWPF.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="Application_Startup">
    </Application>
    

    代码隐藏

    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            if (ConditionIsMet)
            {
                var window = new MainWindow();
                window.Show();
            }
            else
            {
                this.Shutdown();
            }
        }
    }
    
        3
  •  0
  •   AllenM    12 年前

    也许我做这件事真的很困难,但我发现,在启动时通过假设任何事情来对抗调用优先级/顺序都是徒劳的。我真的希望在应用程序启动期间引发的任何异常都能立即冒泡到最外层的异常处理程序,但即使引发了异常处理程序,我的MVVM定位器对象也会自动实例化自己,因为它被定义为应用程序级资源。

    所以解决办法是:

    在顶部添加以下行:

        #region Handlers For Unhandled Exceptions
            // anything else to do on startup can go here and will fire after the base startup event of the application
            // First make sure anything after this is handled
            // Creates an instance of the class holding delegate methods that will handle unhandled exceptions.
            CustomExceptionHandler eh = new CustomExceptionHandler();
    
            AppDomain.CurrentDomain.UnhandledException +=
                 new UnhandledExceptionEventHandler(eh.OnAppDomainException);
            // this ensures that any unhandled exceptions bubble up to a messagebox at least
            Dispatcher.CurrentDispatcher.UnhandledException += new DispatcherUnhandledExceptionEventHandler(eh.OnDispatcherUnhandledException);
    
            #endregion  Handlers For Unhandled Exceptions
    

    例如

     Startup="Application_Startup"   <<<<  this name is arbitrary but conventional AFAICT
    

    4) 在应用程序启动中,创建ViewModelLocator,如下所示:

                Resources.Add("Locator", new ViewModelLocator());
                 //You can use FindResource and an exception will be thrown straightaway as I recall
                if (!(TryFindResource("Locator") == null))  
    
                    throw new ResourceReferenceKeyNotFoundException("ViewModelLocator could not be created", "Locator");
    

                Uri uri = new Uri("pack:Views/MainWindow.xaml", UriKind.RelativeOrAbsolute);
                Application.Current.StartupUri = uri;
    

    如果定位器上的构造函数失败,那么步骤(4)将立即抛出异常,遗憾的是,这种情况一直发生在我身上。

    然后,步骤4中的异常处理如下( :

    public void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            try
            {
    
                    var result = this.ShowExceptionDialog(e.Exception);
    
            }
            catch
            {
    
    
                RadMessageBox.Show("Fatal Dispatcher Error - the application will now halt.", Properties.Resources.CaptionSysErrMsgDlg,
                   MessageBoxButton.OK, MessageBoxImage.Stop, true);
            }
    
            finally
            {
    
                e.Handled = true;
    
                // TERMINATE WITH AN ERROR CODE -1!
                //Environment.Exit(-1);
            }
        }