Заставка с анимированным GIF не анимируется в WPF C # - PullRequest
0 голосов
/ 03 июня 2018

Итак, вот ситуация.В настоящее время я работаю над C # WPF Desktop Application, и я хотел добавить заставку при запуске программы.

Но я не использую класс SplashScreen.Я использую дополнительный класс окон WPF поверх приложения с тем же именем, и я называю этот класс Splashy.

У моего заставки есть анимированное GIF-изображение, которое хорошо работает при анимации на элементе управления WebBrowserКласс Splashy ниже ...

<Image gif:ImageBehavior.AnimatedSource="Images/FSIntro.gif" Margin="10,1,0,10">
    <Image.OpacityMask>
        <ImageBrush ImageSource="Images/FSIntro.gif"/>
    </Image.OpacityMask>
</Image>

... и сам класс Splashy инициализируется как StartupUri ниже в App.XAML.

<Application
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         ...  ...
         ... (some text) ...
         ...  ...
         StartupUri="Splashy.xaml">
<Application.Resources>

Но проблема в этом сценарии заключается в том, что заставка просто зависает и не входит в саму основную программу.

Поэтому я попробовал другой подход.Один с использованием кода.

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

Ниже приведен код класса Splashy

public partial class Splashy : Window
{
    public Intro()
    {
        InitializeComponent();
    }

    public void Outro()
    {
        this.Close();
    }
}

А ниже приведен метод программы, в котором реализуется splashScreen.

public partial class LoginScreen : Window
{
    Splashy splash = new Splashy();

    public LoginScreen()
    {

        splash.Show();
        Thread.Sleep(5000);
        splash.Outro();

        // home screen 
    }
}

Любые указатели и помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 03 июня 2018

Я бы попробовал что-то подобное.Создайте класс Bootstrapper, который обрабатывает всю эту логику.

public class BootStrapper
{
    SplashScreen Splash = new SplashScreen();
    MainWindow MainWindow = new MainWindow();

    public void Start()
    {
        var timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(2);
        timer.Tick += (s, e) =>
        {
            Splash.Close();
            MainWindow.Show();
            timer.Stop();
        };

        timer.Start();
        Splash.Show();
    }
}

Удалите StartupUri из App.xaml, чтобы ваш MainWindow не был создан первым.

<Application x:Class="StackOverflow.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:StackOverflow"
         StartupUri="MainWindow.xaml">

становится ...

<Application x:Class="StackOverflow.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:StackOverflow">

Затем в App.xaml.cs переопределите запуск, чтобы он создал новый экземпляр вашего Bootstrapper класса.

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        var bootStrapper = new BootStrapper();
        bootStrapper.Start();
        base.OnStartup(e);
    }
}
...