【问题标题】:Splash screen appears everytime the project's starting window is invoked..每次调用项目的启动窗口时都会出现启动画面。
【发布时间】:2014-01-17 22:24:33
【问题描述】:

我已经为我的项目实现了一个启动画面,它可以正常工作.. 但在我的项目中,我有一个用户注销选项,这会显示提供不同登录名的起始页面(这是起始屏幕..即“选择登录.xaml”)。因此,当用户在他已经在应用程序中选择一个登录时单击“选择不同的登录”时......再次出现启动画面,这不是必需的并且看起来很奇怪。

以下代码是我认为导致问题的原因......伙计们

public partial class Chooselogin : Window
 {
     public Chooselogin()
     {
         new SplashWindow().ShowDialog();
         InitializeComponent();
     }

......

这段代码是我的“App.xaml”..

<Application x:Class="WpfApplication1.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 StartupUri="Chooselogin.xaml">
       <Application.Resources>
           <ResourceDictionary Source="/Themes/ExpressionDark.xaml"/>
       </Application.Resources>

闪屏代码如下..

public partial class SplashWindow : Window
    {
        Thread loadingThread;
        Storyboard Showboard;
        Storyboard Hideboard;
        private delegate void ShowDelegate(string txt);
        private delegate void HideDelegate();
        ShowDelegate showDelegate;
        HideDelegate hideDelegate;

        public SplashWindow()
        {
            InitializeComponent();
            showDelegate = new ShowDelegate(this.showText);
            hideDelegate = new HideDelegate(this.hideText);
            Showboard = this.Resources["showStoryBoard"] as Storyboard;
            Hideboard = this.Resources["HideStoryBoard"] as Storyboard;
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            loadingThread = new Thread(load);
            loadingThread.Start();
        }
        private void load()
        {
            Thread.Sleep(1000);
            this.Dispatcher.Invoke(showDelegate, "Loading assets...please wait");
            Thread.Sleep(2000);
            //do some loading work
            this.Dispatcher.Invoke(hideDelegate);

            Thread.Sleep(2000);
            this.Dispatcher.Invoke(showDelegate, "Loading profiles..");
            Thread.Sleep(2000);
            //do some loading work
            this.Dispatcher.Invoke(hideDelegate);

            Thread.Sleep(2000);
            this.Dispatcher.Invoke(showDelegate, "Loading Data... almost done");
            Thread.Sleep(2000);
            this.Dispatcher.Invoke(hideDelegate);

            //close the window
            Thread.Sleep(2000);
            this.Dispatcher.Invoke(DispatcherPriority.Normal,
        (Action)delegate() { Close(); });
        }
        private void showText(string txt)
        {
            txtLoading.Text = txt;
            BeginStoryboard(Showboard);
        }
        private void hideText()
        {
            BeginStoryboard(Hideboard);
        }

}

启动画面应该在应用程序开始时打开..请帮助大家..

【问题讨论】:

  • 因为new SplashWindow().ShowDialog();ChooseLogin 的构造函数中,所以每次创建ChooseLogin 窗口时都会调用它。我建议将这行代码移到您在应用程序启动时调用一次的方法中。
  • 另外,.ShowDialog() 会一直阻塞,直到启动画面关闭。在这发生之前它不会继续InitializeComponent,所以这不是启动画面。
  • 这是生产代码吗?我真的不希望

标签: c# wpf xaml


【解决方案1】:

像这样简单的东西怎么样?:

public partial class Chooselogin : Window
{
    private static bool isFirstTime = true;

    public Chooselogin()
    {
        if (isFirstTime)
        {
            new SplashWindow().ShowDialog();
            isFirstTime = false;
        }
        InitializeComponent();
    }

    ...
}

现在它只会显示一次启动画面。

【讨论】:

  • 我已经检查过了,但发生的事情是......每次我选择不同的登录时,对象引用都用于显示选择登录页面,如 .. c.show() .. 那么会发生什么再次将“isFirstTime”变量设置为true..问题仍然存在..我通过使用两个断点调试模块遇到了这个问题..
  • 如果你做到了static呢?
  • 你太棒了...感谢您的评论。谢谢谢谢...真的是你让我的工作变得轻松...
  • @PraveenKartik,在 StackOverflow,我们以某种方式做事。当有人向用户提供帮助他们解决问题的答案时,该用户习惯于accept that answer as the correct answer,以便其他用户知道要查看哪个答案以寻求相同问题的帮助。作为新用户,我还建议您查看Help Center 中的其他各种页面,以便您了解可以做什么和不可以做什么,从而充分利用该网站。跨度>
【解决方案2】:

我推荐 Kent Boogaart 的 reading this post

帖子中的示例

"WPF 提供了一个 SplashScreen 类。它的设计很简单,并解决了启动屏幕的主要目标:即时反馈。凭借放弃 WPF 堆栈,转而依赖 Windows 映像组件 (WIC) 来显示图像,它提供了在屏幕上获得启动的最快途径,而无需编写自己的本机引导程序。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多