【问题标题】:Splash screen to show up in the middle of application启动画面显示在应用程序中间
【发布时间】:2013-02-06 03:47:18
【问题描述】:

我有一个报表名称列表,在 ReportViewer 控件中显示为树层次结构。当用户单击报告名称时,会加载一个输入表单,用户输入一些值并按 OK。此时,启动屏幕应该在后端进程发生时加载(连接到数据库、检索值等)。在 Reportviewer 编辑器中加载报告后,启动画面应关闭。

到目前为止,我可以显示启动画面,但它会卡在那个点,实际报告不会加载,并且启动画面会永远保持。

是否可以在应用程序中间而不是在应用程序启动时使用启动画面?如果是这样,我该如何继续加载报告?

static class Program
{
    [STAThread]
    static void Main(string[] args)

    {

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new SnapPlusReports());

        //new SplashScreenApp().Run(args);
    }
}

public class SplashScreenApp : WindowsFormsApplicationBase
{
    private static SplashScreenApp _application;

    public static void Run(Form form)
    {
        _application = new SplashScreenApp { MainForm = form };
        _application.Run(Environment.GetCommandLineArgs());
    }

    protected override void OnCreateSplashScreen()
    {
        this.SplashScreen = new ShowProgress();
        base.OnCreateSplashScreen();
    }

}

【问题讨论】:

  • 您是否尝试过使用BeginInvoke() 在单独的线程上运行它?另外,您没有将其显示为模态,对吗?请发布一些特定解决方案的代码...
  • 你确定你的工作安排在后台线程而不是 UI 线程本身吗?
  • @allen - 我正在尝试使用 Visual Basic 程序集来实现。这是一个链接 - softwarepassion.com/…
  • @PinnyM - 添加了一些代码。它在应用程序启动时工作正常。但这不是我想要的。我希望加载进度条,然后在 reportviewer 编辑器加载报告时关闭它。
  • 我很好奇你是否找到了解决这个问题的方法以及你使用了什么。

标签: c# winforms


【解决方案1】:

我以前通过在运行时使用代码动态创建一个新表单来做到这一点。确保您设置了所有选项,尤其是 FormBorderStyle 为无,或类似的设置,因此用户无法关闭它。然后只需操作出现在该表单上的标签,并在您的过程完成后最终将其关闭。 这样您就不必担心线程问题,而且一个不错的副作用是初始表单不可点击。

例如,我有一个在运行时弹出的关于表单(当然我没有更改任何内容,但想法就在那里:

AboutForm aboutForm = new AboutForm();
aboutForm.StartPosition = FormStartPosition.CenterParent;
Label lblAbout = new Label();
Version applicationVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
lblAbout.Text = applicationVersion.ToString();
lblAbout.Location = new Point(145,104);
aboutForm.Controls.Add(lblAbout);
aboutForm.ShowDialog();

这显示了当前程序的版本号等。表单上已经存在其他标签(我先直观地创建了它,然后调用了它的一个实例)。

希望这会有所帮助!

【讨论】:

  • 这个有进度条吗?还是只是带有标签的表单?
  • 可以像添加标签一样添加进度条。即 ProgressBar pgBar = new ProgressBar(); .然后就可以像标签一样编辑它的位置、属性等。
【解决方案2】:

...如果您在给定时间只需要一个应用程序副本在内存中,则捕获其他实例并优雅退出

static void Main()
{
    Application.EnableVisualStyles();
    bool exclusive;
    System.Threading.Mutex appMutex = new System.Threading.Mutex(true, "MY_APP", out exclusive);
    if (!exclusive)
    {
         MessageBox.Show("Another instance of xxxx xxxBuilder is already running.","MY_APP",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Exclamation );
                    return;
    }
    Application.SetCompatibleTextRenderingDefault(false);
    xxxWindowsApplication.InitializeApplication();
    Application.Run(new frmMenuBuilderMain());
                GC.KeepAlive(appMutex);
            }

在主表单加载中,您可以执行以下操作:

private void frmMenuBuilderMain_Load(object sender, EventArgs e)
{   

     //Show Splash with timeout Here--
     if(!SystemLogin.PerformLogin())             
     {
         this.Close();
         return;
     }
     tmrLoad.Enabled = true;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多