Использование StatusBar в WP8.1 и обёртка для него
Одна из самых часто используемых штук в Windows Phone — это StatusBar, и он, как и многое другое, был стандартизирован и теперь работа с ним выглядит совсем иначе, но зато удобнее.
// Получаем текущий statusBar / Get current StatusBar var statusBar = Windows.UI.ViewManagement.StatusBar.GetForCurrentView(); // Устанавливаем фон и всякие плюшки / Set Background statusBar.BackgroundColor = (App.Current.Resources["PhoneAccentBrush"] as SolidColorBrush).Color; statusBar.BackgroundOpacity = 1; // Устанавливаем текст Set the text on the ProgressIndicator statusBar.ProgressIndicator.Text = "class.expert"; // Показываем индикатор / show statusBar.ProgressIndicator.ShowAsync(); // Устанавливаем: 0 - нет прогресса, null - точечки, 0..1 - отображаем прогресс, к примеру загрузки / Set it to 0 if you don't wish to show the progress bar. statusBar.ProgressIndicator.ProgressValue = 0;
А чтобы было ещё удобнее, я так, ради смеха, написал к нему обёртку. Мне пока не надо, но просто хотелось поиграться, на будущее.
Можно использовать как угодно, но:
1. В реальных условиях я ещё не тестировал
2. Копирайты сохраняем, даже при модификации
3. Заглядывайте за обновлением, скорее всего рано или поздно оно мне понадобиться и будут реализованы новые ништяки.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Windows.UI.ViewManagement; using Windows.UI.Xaml; // You can use this code as you want // You should respect copyrights and save it in any cases // CopyRight http://class.expert/ namespace App3 { /// <summary>Wrapper for StatusBar in Windows Phone 8.1</summary> public static class Info { private static StatusBar _statusBar { get { return StatusBar.GetForCurrentView(); } } private static DispatcherTimer _msgTimer; private static Queue<string> _messages; public static int Count { get { return _messages == null ? 0 : _messages.Count; } } /// <summary>Initialize and Show Status Bar</summary> /// <param name=" messageInterval">Interval between messages in queue public static void Init(TimeSpan messageInterval) { _messages = new Queue<string>(); _msgTimer = new DispatcherTimer(); _msgTimer.Interval = messageInterval; _msgTimer.Tick += _msgTimer_Tick; Show(); } /// <summary>Initialize and Show Status Bar with 5 sec interval</summary> public static void Init() { Init(TimeSpan.FromSeconds(5)); } /// <summary>Show CURRENT ProgressIndicator in StatusBar</summary> public async static void Show() { StopProgress(); await _statusBar.ProgressIndicator.ShowAsync(); } public static void StartIndeterminate() { _statusBar.ProgressIndicator.ProgressValue = null; } public static void SetProgress(double val) { _statusBar.ProgressIndicator.ProgressValue = val; } /// <summary>Stop any progress</summary> public static void StopProgress() { _statusBar.ProgressIndicator.ProgressValue = 0; } /// <summary>Add message to messages queue</summary> public static void Add(string msg) { _messages.Enqueue(msg); Resume(); } /// <summary>end current info and show other just now</summary> public static void QuickInform(string msg) { _msgTimer.Stop(); SetText(msg); Resume(); } /// <summary>clear messages queue and current info</summary> public static void Clear() { _msgTimer.Stop(); _messages.Clear(); SetText(string.Empty); } /// <summary>set permament text and stop messages queue</summary> public static void SetTextAndStop(string text) { Stop(); SetText(text); } /// <summary>stop messages queue</summary> public static void Stop() { _msgTimer.Stop(); } /// <summary>resume messages queue</summary> public static void Resume() { if (!_msgTimer.IsEnabled && _messages.Count > 0) _msgTimer.Start(); } /// <summary>set permament operation text and start progress indeterminate</summary> public static void StartOperation(string name) { SetTextAndStop(name); StartIndeterminate(); } /// <summary>Stop any progress and resume message queue</summary> public static void StopOperation(string result="") { StopProgress(); SetText(result); Resume(); } static void _msgTimer_Tick(object sender, object e) { if (_messages.Count > 0) { SetText(_messages.Dequeue()); } else { _msgTimer.Stop(); SetText(string.Empty); } } private static void SetText(string text) { _statusBar.ProgressIndicator.Text = text; } } }
Example:
Info.Init(); Info.Add("Hello"); // Показываем Hello Info.Add("World"); // Добавляем в очередь сообщений World Info.QuickInform("Some Message"); // Затираем World, Выводим Some Message // Через 5 сек. показываем World
Прочая информация в комментариях, как водится на ломанном английском 😉