Закрытие с таймаутом не работает в консоли, чтобы закрыть заставку - PullRequest
3 голосов
/ 26 июня 2019

Я сделал класс, я делаю пример. В указанном случае у меня есть эти строки кода, чтобы показать и закрыть заставку.

// Open (show)
public void ShowSplashScreen(bool autoClose = false)
{
    splashscreen.Show(autoClose, true);
}

// Close (don't show)
public void CloseSplashScreen()
{
    splashscreen.Close(TimeSpan.FromSeconds(0.3));
}

Показывается нормально, но никогда не закрывается, просто остается там.

Это документация на заставке. Закрыть: https://docs.microsoft.com/en-us/dotnet/api/system.windows.splashscreen.close?view=netframework-4.8

[System.Security.SecurityCritical]

public void Close (TimeSpan fadeoutDuration);

Примечание: я использую метод show с параметрами AutoClose, установленными на false, и TopMost, установленными на true, это не позволяет автоматически закрывать, так как я хочу закрыть его программно, а не подписаться на существующие события.


Я запускаю строки кода из консольного приложения (.NET Framework) в целях тестирования, прежде чем полностью внедрить его в мой пользовательский интерфейс.


Что я пробовал: Отладка и даже попытка вызова show снова перед вызовом close.


Это определенно что-то не так с классом, так как вызов класса и непосредственное манипулирование свойством работают:

ClassSplashScreen rss = new ClassSplashScreen();
rss.splashscreen.Show(false);
rss.splashscreen.Close(TimeSpan.FromSeconds(1));

Мое лучшее предположение, что что-то вешает интерфейс и замораживает его? Но я не уверен, что с этим делать.


Код для запуска, чтобы проверить это

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace NamespaceName
{
    public class StackOverFlowCode
    {
        static void Main(string[] args)
        {
            ClassSplashScreen screen = new ClassSplashScreen();
            screen.ShowSplashScreen();
            screen.CloseSplashScreen();
        }

    }
    public class ClassSplashScreen
    {
        public SplashScreen splashscreen { get; set; }
        public ClassSplashScreen()
        {
            splashscreen = new SplashScreen("Resource Image Link");
        }
        public void ChangeSplashResource(SplashScreen resource)
        {
            splashscreen = resource;
        }
        public void ShowSplashScreen(bool autoClose = false)
        {
            splashscreen.Show(autoClose, true);
        }
        public void CloseSplashScreen()
        {
            splashscreen.Close(TimeSpan.FromSeconds(1));
        }
    }
}

1 Ответ

4 голосов
/ 26 июня 2019

SplashScreen использует диспетчер, но по умолчанию в консольном приложении никого нет. Если вы создаете System.Windows.Application, он должен работать как положено:

public class StackOverFlowCode
{
    [STAThread]
    static void Main(string[] args)
    {
        Application app = new Application();
        app.Startup += (s, e) => 
        {
            ClassSplashScreen screen = new ClassSplashScreen();
            screen.ShowSplashScreen();
            screen.CloseSplashScreen();
        };
        app.Run();
    }
}

public class ClassSplashScreen
{
    private readonly SplashScreen splashscreen;

    public ClassSplashScreen() => splashscreen = new SplashScreen("Resource Image Link");

    public void ShowSplashScreen() => splashscreen.Show(false);

    public void CloseSplashScreen() => splashscreen.Close(TimeSpan.FromSeconds(1));
}
...