Archive
SplashScreen в WPF на базе Window
Итак, стандартные средства WPF предоставляют нам класс SplashScreen, но его возможностей достаточно мало. Да и предназначен он в первую очередь для того чтобы пользователь не думал что приложение "подвисло", пока грузятся все библиотеки WPF. Поэтому он и наследуется от Object, а не от DependencyObject. Все что он умеет – это создавать средствами Win32 API окно, класть в него изображение и удалять это окно Fade эффектом.
Однако его возможностей может не хватить разработчику приложения. На своей работе столкнулся с задачей: надо сделать Splash Screen. Причем, перечислять в нем загружаемые модули, версию ПО, и другую информацию. Это не возможно сделать средствами стандартного класса. Также хотелось бы чтобы загрузка приложения велась из основного потока. Потому как мне не охота нагружать разработчиков сторонних приложений лишними задачами. Поэтому мое окно SplashScreen должно находиться в отдельном потоке и принимать изменения состояния плагинной системы. [updated]
Мой класс призван решить эту проблему. Он создает отдельный STA поток (именно STA). И открывает в нем Ваш Splash Screen на базе Window. Основной же поток приложения уходит в выборку сообщений без основного окна. Далее, по инициализации splash, дергается Loaded, который пробрасывается в диспетчер основного потока.
Тот, кто перехватил этот Event, может спокойно осуществить свою наукоемкую операцию, поскольку он не трогает при этом поток splash.
Для того чтобы обновить данные в splash окне (о-ло-ло! плагин загружен!), вызывается метод Invoke или BeginInvoke у класса провайдера SplashScreenProvider. Замечу, есть одна недоработка. Если Вам вдруг(!) захочется показать на экране 2 или более splash screen (хотя, мне сложно представить себе реальную ситуацию), будет плохо. Поскольку данный код это не поддерживает.
Меньше слов, больше музыки ![]()
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Threading;
namespace SplashScreenProvider
{
public delegate void SplashWindowStateChanged(Window splash);
public static class SplashWindowProvider
{
public static void ShowWindow<T>() where T : Window
{
var thread = new Thread(new ThreadStart(
delegate
{
_dispatcher = Dispatcher.CurrentDispatcher;
_dispatcher.BeginInvoke(new Action(
delegate
{
var splash = (Window)typeof(T).Assembly.CreateInstance(typeof(T).FullName);
splash.Loaded +=
delegate
{
InvokeWindowLoaded(splash);
};
splash.Closed +=
delegate
{
_dispatcher.InvokeShutdown();
InvokeWindowClosed(splash);
};
splash.ShowDialog();
}));
Dispatcher.Run();
}));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
public static event SplashWindowStateChanged WindowLoaded;
public static void InvokeWindowLoaded(Window window)
{
if (WindowLoaded != null)
{
foreach(var @delegate in WindowLoaded.GetInvocationList())
{
Application.Current.Dispatcher.BeginInvoke(@delegate, window);
}
}
}
public static event SplashWindowStateChanged WindowClosed;
public static void InvokeWindowClosed(Window window)
{
if (WindowClosed != null)
Application.Current.Dispatcher.BeginInvoke(WindowClosed, window);
}
public static void BeginInvoke(Action action)
{
_dispatcher.BeginInvoke(action);
}
public static void Invoke(Action action)
{
_dispatcher.Invoke(action);
}
private static Dispatcher _dispatcher;
}
}
Окно Splash с полупрозрачностями, эффектами и анимацией (теоретически):
using System;
using System.Windows;
namespace Trader
{
/// <summary>
/// Interaction logic for SplashWindow.xaml
/// </summary>
public partial class SplashWindow : Window
{
public SplashWindow()
{
InitializeComponent();
}
public String State {
set { m_label.Content = value; }
}
}
}Использование из Application: /// <summary>
/// Program entry point.
/// </summary>
[STAThread]
private static void Main(string[] args)
{
// Run main loop
new Program().Run();
}
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
SplashWindowProvider.WindowLoaded += OnSplashWindowLoaded;
SplashWindowProvider.WindowClosed += OnSplashWindowClosed;
SplashWindowProvider.ShowWindow<SplashWindow>();
}
private void OnSplashWindowLoaded(Window window)
{
var splash = (SplashWindow) window;
PluginsManager.Loading += s => SplashWindowProvider.Invoke(() => splash.State = s);
PluginsManager.Start();
SplashWindowProvider.Invoke(splash.Close);
}
private void OnSplashWindowClosed(Window splash)
{
Window window;
if ((window = CreateMainWindow()) != null)
{
MainWindow = window;
MainWindow.ShowDialog();
}
} Также, как было замечено в комментариях и изначально профукано мной, идея SplashScreen без WPF в том, чтобы показать хоть что-то. Потому как WPF может грузиться довольно долго. Исходя из этого, можно дополнить функциональность моего примера например, так:
Создаем таймер на 700 миллисекунд;
Если WPF прогрузился раньше таймера, таймер убиваем;
Если сработал таймер, а WPF не успел прогрузиться, показываем небольшую картинку с временным splash.
главное, обставить дизайн так, чтобы временный Splash не выглядел как баннер. На мое разумение, много чередующихся стартовых заставок (много – это больше 1), смахивает на баннеры. А баннеры раздражают.
Комментируем
Как сериализировать объект Dictionary
Для создания отчетов мне понадобилось представление объекта в XML формате. Я прочитал эту статью и попробовал описанные действия на практике. Все бы хорошо, но столкнулся с такой проблемой: в .NET не реализована сериализация классов IDictionary и у меня возникло следующие исключение : "System.NotSupportedException: The type X is not supported because it implements IDictionary". Читать полностью
Регистрируемся на Visual Studio 2010 Beta Exams
Компания Microsoft приглашает нас принять участие в одном или больше бета экзаменах для Visual Studio 2010 и Microsoft. NET Framework 4. Приняв участие в бета экзаменах, у нас есть возможность предоставить Microsoft отзывы о содержании экзамена, что является неотъемлемой частью развития экзаменов перед тем, как они станут доступными для всех. В наличии такие экзамены: Читать полностью
Delphi 2009 Handbook with SourceCode
Delphi 2009 Handbook Marco Cantù
Publisher: Wintech Italia Srl (January 1, 2008)
ASIN: B00262OUS8
The complete guide to CodeGear Delphi 2009 from the best selling author of the Mastering Delphi series and the Delphi 2007 Handbook. Learn all of the new features of the latest Delphi, including Unicode, Generics, the Ribbon control, DataSnap 2009, and much more. The book has 400 pages full of information and examples.
Delphi 2009 Handbook with SourceCode
Delphi 2009 Handbook Marco Cantù
Publisher: Wintech Italia Srl (January 1, 2008)
ASIN: B00262OUS8
The complete guide to CodeGear Delphi 2009 from the best selling author of the Mastering Delphi series and the Delphi 2007 Handbook. Learn all of the new features of the latest Delphi, including Unicode, Generics, the Ribbon control, DataSnap 2009, and much more. The book has 400 pages full of information and examples.
Microsoft выпустила превью-версию IE9 для разработчиков с поддержкой HTML5
Итак, в ходе второго дня MIX 2010 компания Microsoft официально представила раннюю версию Internet Explorer 9 в виде превью-версии для разработчиков. "Тест-драйв" Internet Explorer 9 уже доступен на сайте ietestdrive.com. Данная сборка не содержит элементы пользовательского интерфейса, но позволяет разработчикам протестировать новый движок JavaScript и поддержку HTML5/CSS3.
Microsoft выпустила превью-версию IE9 для разработчиков с поддержкой HTML5
Итак, в ходе второго дня MIX 2010 компания Microsoft официально представила раннюю версию Internet Explorer 9 в виде превью-версии для разработчиков. "Тест-драйв" Internet Explorer 9 уже доступен на сайте ietestdrive.com. Данная сборка не содержит элементы пользовательского интерфейса, но позволяет разработчикам протестировать новый движок JavaScript и поддержку HTML5/CSS3.
Первая предварительная версия IE9 доступна разработчикам
Когда мы внимательно взглянули на HTML5, мы увидели, что эта технология ознаменует появление нового класса приложений. Эти приложения будут нагружать среду исполнения браузера и имеющееся аппаратное обеспечение иным образом, отличным от существующих сайтов.
Первая предварительная версия IE9 доступна разработчикам
Когда мы внимательно взглянули на HTML5, мы увидели, что эта технология ознаменует появление нового класса приложений. Эти приложения будут нагружать среду исполнения браузера и имеющееся аппаратное обеспечение иным образом, отличным от существующих сайтов.
Recent Comments