Прозрачное окно при загрузке содержимого

К сожалению, ни одного вопроса по этой проблеме в stackoverflow. Ну, по крайней мере, ни один из тех, с которыми я столкнулся во время поиска.

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

Это приводит к тому, что главное окно остается прозрачным, как показано на рисунке [1] ниже, в течение некоторого разумного времени. Информация, собранная из Интернета, состоит из некоторого xml, а также данных из базы данных MySQL.

У меня есть событие Window_Loaded, которое выглядит так:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        method1();
        method2(1);
        method3();
        .
        .
        .
        //method6();
    }

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

Однако я хочу, чтобы окно загружалось нормально, а затем, возможно, имело индикаторы загрузки для информирования пользователя о загрузке содержимого.

p.s. Я использую элементы управления mahapps.metro.

заранее спасибо


person Alex    schedule 06.09.2012    source источник
comment
используйте другой поток, кроме потока пользовательского интерфейса, для загрузки данных. Например, вы можете использовать BackgroundWorker   -  person Renatas M.    schedule 06.09.2012


Ответы (2)


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

person SLaks    schedule 06.09.2012
comment
Я посмотрю на это. Спасибо - person Alex; 06.09.2012

попробуй это

Главное окно и код.

<Window x:Class="SplashScreenWithStatus.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="600" Width="800" Loaded="Window_Loaded">
    <Grid>

    </Grid>
</Window>



 public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            // Setting the status to show the application is still loading data
            Splash.Loading("Connecting...");
            // Set to sleep to simulate long running process
            Thread.Sleep(1500);
            Splash.Loading("Retrieving....");
            Thread.Sleep(1500);
            Splash.Loading("Success....");
            Thread.Sleep(1500);
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Splash.EndDisplay();
        }
    }

Заставка и код

общедоступный частичный класс Splash: Window { private static Splash splash = new Splash();

    // To refresh the UI immediately
    private delegate void RefreshDelegate();
    private static void Refresh(DependencyObject obj)
    {
        obj.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render,
            (RefreshDelegate)delegate { });
    }

    public Splash()
    {
        InitializeComponent();
    }

    public static void BeginDisplay()
    {
        splash.Show();
    }

    public static void EndDisplay()
    {
        splash.Close();
    }

    public static void Loading(string test)
    {
        splash.statuslbl.Content = test;
        Refresh(splash.statuslbl);
    }

    }

XAML и код класса приложения

<Application x:Class="SplashScreenWithStatus.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Window1.xaml" Startup="Application_Startup">
    <Application.Resources>

    </Application.Resources>
</Application>

 public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            Splash.BeginDisplay();
        }
    }
person JSJ    schedule 06.09.2012
comment
Спасибо за комментарий, это решение тоже работает, однако мне нужен был BackgroundWorker. - person Alex; 06.09.2012