none
C# WPF как сделать SplashScreen из формы RRS feed

  • Вопрос

  • Как сделать заставку при запуске приложения в которой бы отображался процесс загрузки основного приложения, например подключение к базе загрузка библиотек и т.д.
    • Перемещено Abolmasov Dmitry 19 декабря 2012 г. 12:42 (От:Языки программирования)
    14 декабря 2012 г. 10:54

Ответы

  • Стандартным способом никак, но можно нестандартным.

    Для этого в классе App.xaml.cs в событии Sturtup запускайте нужное вам окно, которое будет следить за состоянием загрузки "тяжелых" компонентов. Как только все они будут готовы вы это окно закрываете а следующая строчка уже в событии Sturtup вызывает основное окно. Если отображение данные в основном окне реализовано правильно, то задержка перед его появлением на экран будет минимальной.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа Abolmasov Dmitry 19 декабря 2012 г. 15:17
    14 декабря 2012 г. 13:52
    Отвечающий

Все ответы

  • Стандартным способом никак, но можно нестандартным.

    Для этого в классе App.xaml.cs в событии Sturtup запускайте нужное вам окно, которое будет следить за состоянием загрузки "тяжелых" компонентов. Как только все они будут готовы вы это окно закрываете а следующая строчка уже в событии Sturtup вызывает основное окно. Если отображение данные в основном окне реализовано правильно, то задержка перед его появлением на экран будет минимальной.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа Abolmasov Dmitry 19 декабря 2012 г. 15:17
    14 декабря 2012 г. 13:52
    Отвечающий
  • был бы признателен за пример
    17 декабря 2012 г. 2:53
  • Привет.

    В качестве примеров вы можете посмотреть статью SplashScreen в WPF на базе Window и Dynamic splash screen in WPF

    Надеюсь это поможет вам.


    Для связи [mail]

    17 декабря 2012 г. 10:55
  • за основу взял второй пример плюс добавил progressbar при  попытке изменить значение value в progressbar не чего не происходит

    код xaml окна

    <ProgressBar Value="{Binding ElementName=splashScreen, Path=progressBar.value}" Maximum="100" Minimum="0" VerticalAlignment="Bottom" Height="25"></ProgressBar>

    код привязки элемента не исключено что реализовано не правильно пробовал много разных вариантов не один не сработал

     ProgressBar pb=new ProgressBar();
                pb.Height=20;
                pb.Width=100;
                pb.Minimum=0;
                pb.Maximum=5;
    
    
                var startupTask = new Task(() =>
                    {
                        for (int i = 0; i < 4; i++)
                        {              
    
                            splashScreen.Dispatcher.Invoke(new ThreadStart(delegate { pb.Value = 6; }));         
                            splashScreen.Dispatcher.BeginInvoke((Action)(() => splashScreen.progressBar=pb));
                            Thread.Sleep(1000);
                        }
                    });


     public static readonly DependencyProperty ProgressBarProperty =
               DependencyProperty.Register("ProgressBarProperty", typeof(ProgressBar), typeof(SplashScreen),
                                           new UIPropertyMetadata(null, OnProgressBarChanged));
    
            public ProgressBar progressBar
            {
                get { return (ProgressBar)this.GetValue(ProgressBarProperty); }
                set { this.SetValue(ProgressBarProperty, value); }
            }
    
            public event EventHandler ProgressBarChange;
    
    
            private void ProgressBarChanded(EventArgs e)
            {
                EventHandler handler = this.ProgressBarChange;
                if (handler != null) handler(this, e);
            }
    
            private static void OnProgressBarChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                SplashScreen splashScreen = (SplashScreen)d;
                splashScreen.ProgressBarChanded(EventArgs.Empty);
            }

    код вызова 

     ProgressBar pb=new ProgressBar();
                pb.Height=20;
                pb.Width=100;
                pb.Minimum=0;
                pb.Maximum=5;
    
    
                var startupTask = new Task(() =>
                    {
                        for (int i = 0; i < 4; i++)
                        {                       
    
                            splashScreen.Dispatcher.Invoke(new ThreadStart(delegate { pb.Value = 6; }));         
                            splashScreen.Dispatcher.BeginInvoke((Action)(() => splashScreen.progressBar=pb));
                            Thread.Sleep(1000);
                        }
                    });

    20 декабря 2012 г. 3:23
  • разобрался в чем причина при привязке элемента необходимо передавать текст а не float  
    20 декабря 2012 г. 4:46