2012-06-15 3 views
0

У меня есть заставка, в которую я хотел бы затухать, в то время как мое приложение отключается и что-то делает, а затем после завершения, если прошло определенное количество времени, закрывает заставку и загружает основной экран.Задержка после отображения экрана заставки, вызывающего проблемы

Проблема, которую я получаю, заключается в том, что, пока я зацикливаюсь, чтобы проверить, прошло ли время, она, похоже, не обрабатывает мою раскадровку, чтобы исчезнуть в заставке.

После прочтения, я думаю, я должен начинать всплеск на другой теме?

Heres код:

public partial class App : Application 
    { 
     private void Application_Startup(object sender, StartupEventArgs e) 
     { 
      MySplashScreen splash = new MySplashScreen(); 
      splash.Show(); 
      Stopwatch sw = new Stopwatch(); 
      sw.Start(); 
      while (sw.Elapsed.TotalSeconds < 10) 
      { 
      } 
      splash.Close(); 
      MainWindow mw = new MainWindow(); 
      mw.Show(); 

     } 

    } 

Вопрос в том, когда я добавить анимацию. Это похоже на то, что он не применяет какой-либо процессор к выцветанию, потому что он застрял в цикле while.

<Window x:Class="Splash_Demo.MySplashScreen" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Height="550" Width="900" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" WindowStyle="None" ShowInTaskbar="False" Background="Transparent" AllowsTransparency="True" Opacity="0"> 
    <Window.Triggers> 
     <EventTrigger RoutedEvent="Window.Loaded"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimation Duration="00:00:03" Storyboard.TargetProperty="Opacity" To="1" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Window.Triggers> 
    <Canvas Height="498" Width="839"> 
     <Canvas.Background> 
      <ImageBrush ImageSource="C:\Users\Ash\Downloads\XactSplash.png"/> 
     </Canvas.Background> 
     <Label Canvas.Left="291" FontFamily="Algerian" Canvas.Top="413" Name="Customer" Height="43" Width="185" HorizontalContentAlignment="Left" VerticalContentAlignment="Center"/> 
     <Image Canvas.Left="500" Canvas.Top="165" Height="164" Name="image1" Stretch="Fill" Width="211" Source="C:\Users\Ash\Downloads\Zerix.bmp" /> 
     <Label Canvas.Left="191" Canvas.Top="376" FontSize="8" Content="Label" Height="19" Name="lblYear" Width="30" HorizontalContentAlignment="Left" VerticalContentAlignment="Center" /> 
    </Canvas> 

</Window> 

ответ

2

Вы заняты ожиданием, в результате чего поток пользовательского интерфейса блокируется и занимает много процессора в процессе. Вместо этого настройте таймер в Application_Startup и откройте главное окно, когда оно истечет.

+0

Спасибо за это. Сможете ли вы опубликовать небольшой пример кода? – user589195

+0

Также одна вещь, которую я, вероятно, должен был задать в моем вопросе, заключается в том, что я могу захотеть делать другие вещи, такие как предварительная загрузка dll, когда открыт вскрытый экран. – user589195

+0

Сделайте это из фонового потока, если это возможно. – zmbq

1

Пока вы не можете запускать какие-либо анимации, поскольку ваш поток пользовательского интерфейса заблокирован (и, следовательно, ждет, чтобы запустить анимацию). Попробуйте использовать DispatcherTimer вместо

+0

Любые причины не использовать стандартный класс Timer в качестве противопоставления DispatchTimer? – user589195

0

Лучший способ и с помощью API является

SplashScreen splash = new SplashScreen("splashscreen.jpg"); 
    splash.Show(false); 
    splash.Close(TimeSpan.FromMilliseconds(2)); 
    InitializeComponent(); 
Смежные вопросы