Как сделать всплывающую подсказку в UWP?

306
27 августа 2017, 02:07

Допустим пропал интернет, и необходимо чтобы снизу не на долго появилась надпись "проверьте подключение к интернету". На андроиде такое есть, а вот на Windows UWP я найти никак не могу...

Answer 1

Я считаю, что более правильное решение — использовать средства, предоставляемые ОС, являющиеся ее частью дизайна. В UWP для нотификаций используются плитки, бейджи и "тосты", вот именно "тосты" (toast notifications) и подойдут вам в этой ситуации.

Для удобного формирования разметки toast notification (а они размечаются в XML) я использую Microsoft.Toolkit.Uwp.Notifications, вот здесь есть несколько примеров использования пакета на все случаи жизни: Adaptive and interactive toast notifications for Windows 10.

Я набросал следующий класс:

class Toaster
{
    public static void Show()
    {
        ToastContent toastContent = new ToastContent
        {
            Visual = new ToastVisual
            {
                BindingGeneric = new ToastBindingGeneric
                {
                    Children =
                    {
                        new AdaptiveText
                        {
                            Text = "Проверьте подключение к интернету"
                        }
                    },
                    AppLogoOverride = new ToastGenericAppLogo
                    {
                        Source = "disconnect.png",
                        HintCrop = ToastGenericAppLogoCrop.Circle
                    }
                }
            }
        };
        var toast = new ToastNotification(toastContent.GetXml());
        ToastNotificationManager.CreateToastNotifier().Show(toast);
    }
}

Теперь из подписчика на нужное событие вы можете вызвать:

Toaster.Show();

И появится сообщение, смартфона с Windows у меня больше нету, поэтому не могу показать с него скрин, но в десктопной версии это выглядит так:

Другой способ, который мне нравится меньше. Он требует чтобы все ваши Page имели в качестве корневого элемента любую панель (любой производный класс от Panel).
Добавьте в нужный обработчик следующий код:

await CoreApplication.MainView.CoreWindow
        .Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
    var rootPanel = ((Window.Current.Content as Frame)?.Content as Page)?.Content as Panel;
    if (rootPanel == null) return;
    var tt = new ToolTip
    {
        Margin = new Thickness(5, 0, 5, 50),
        HorizontalAlignment = HorizontalAlignment.Stretch,
        VerticalAlignment = VerticalAlignment.Bottom,
        Content = new TextBlock
        {
            Text = "Проверьте подключение к интернету",
            TextWrapping = TextWrapping.WrapWholeWords,
            HorizontalAlignment = HorizontalAlignment.Center
        }
    };
    rootPanel.Children.Add(tt);
    await Task.Delay(TimeSpan.FromSeconds(1));
    rootPanel.Children.Remove(tt);
});

Он создает ToolTip, помещает его на панель, ждет секунду и удаляет его.
По хорошему шаблон тултипа нужно поместить в ресурсы App.xaml или в библиотеку ресурсов.

READ ALSO
Обработать клик по кнопке в ASP MVC

Обработать клик по кнопке в ASP MVC

Есть простейшее MVC приложение из кнопки <button> и текстового поля <text>Как при клике на кнопку изменить текст в <text>? У меня вот такой...

292
Отправить POST запрос с JSON телом C#

Отправить POST запрос с JSON телом C#

Как отправить запрос я разобрался (использую библиотеку xNet), а как изменить его тело нет, дайте пример с использованием xNet или стандартных...

736
Передать в делегат Func динамический тип

Передать в делегат Func динамический тип

В качестве аргумента у метода нужен делегат Func в котором первый параметр - Type не известен:

246
Получение guid из .asset файла

Получение guid из .asset файла

Имеется файл с расширениемasset

257