Получить событие кнопки из уведомления Windows

#c# #wpf #toast

#c# #wpf #тост

Вопрос:

У меня проблема с получением события нажатия кнопки в окне уведомлений в Windows 10. Мне нужно скопировать текст из заголовка уведомления в буфер обмена при нажатии кнопки. Но я не могу понять, как получить нажатие кнопки. В отправителе ToastNotification я получаю полный XML-документ, в ToastDismissedEventArgs e я всегда получаю тайм-аут, я не могу получить щелчок по кнопке или просто щелчок по уведомлению. Здесь я создаю уведомление:

 var request = new ToastRequest
            {
                ToastTitle = title,
                ToastBody = body,
                ToastXml = InteractiveToast(title, body),
                ToastLogoFilePath = $"file:///{Path.GetFullPath("Resources/clock-alarm.png")}",
                ShortcutFileName = "UPARM_Helper.lnk",
                ShortcutTargetFilePath = Assembly.GetExecutingAssembly().Location,
                AppId = "UPARM_Helper_B",
                ActivatorId = guid
            };
var result = await ToastManager.ShowAsync(request);
 

Это тело:

 private string InteractiveToast(string title, string body) 
        {
            return new ToastContent
            {
                Scenario = ToastScenario.Reminder,
                Launch = title,
                Visual = new ToastVisual
                {
                    BindingGeneric = new ToastBindingGeneric
                    {
                        Children =
                        {
                            new AdaptiveText {Text = title}, // Title
                            new AdaptiveText {Text = body} // Body
                        },
                        AppLogoOverride = new ToastGenericAppLogo
                        {
                            Source = $"file:///{Path.GetFullPath("Resources/clock-alarm.png")}",
                            HintCrop = ToastGenericAppLogoCrop.Circle,
                            AlternateText = "Logo"
                        }
                    }
                },
                Duration = ToastDuration.Long,
                Audio = new ToastAudio
                {
                    Loop = true,
                    Src = new Uri("ms-winsoundevent:Notification.Looping.Alarm4")
                },
                Actions = new ToastActionsCustom
                {
                    Buttons =
                    {
                        new ToastButton("copy", title),
                    }                
                }
            }.GetContent();
        }
 

И здесь обработчик событий:

 void Dismissed(ToastNotification sender, ToastDismissedEventArgs e)
            {
                if(content == "copy")
                {
                    Thread thread = new Thread(() => Clipboard.SetText(arguments));
                    thread.SetApartmentState(ApartmentState.STA);
                    thread.Start();
                    thread.Join();
                }
                switch (e.Reason)
                {
                    case ToastDismissalReason.ApplicationHidden:
                    {
                        tcs.SetResult(ToastResult.ApplicationHidden);
                        break;
                    }
                    case ToastDismissalReason.UserCanceled:
                    {
                        tcs.SetResult(ToastResult.UserCanceled);
                        break;
                    }
                    case ToastDismissalReason.TimedOut:
                    {
                        tcs.SetResult(ToastResult.TimedOut);
                        break;
                    }
                }
            }
 

Ответ №1:

Если предположить, что ToastButton является элементом управления (производным от кнопки), а не ViewModel.
В таком случае просто выберите обработчик для кнопки.. и вызовите свой метод внутри

 private string InteractiveToast(string title, string body) 
        {
            var copyToastButton= new ToastButton("copy", title);
            copyToastButton.Click  =(s,e) => {
                   // here the code for call Dismissed()
            };

            return new ToastContent
            {
                Scenario = ToastScenario.Reminder,
                Launch = title,
                Visual = new ToastVisual
                {
                    BindingGeneric = new ToastBindingGeneric
                    {
                        Children =
                        {
                            new AdaptiveText {Text = title}, // Title
                            new AdaptiveText {Text = body} // Body
                        },
                        AppLogoOverride = new ToastGenericAppLogo
                        {
                            Source = $"file:///{Path.GetFullPath("Resources/clock-alarm.png")}",
                            HintCrop = ToastGenericAppLogoCrop.Circle,
                            AlternateText = "Logo"
                        }
                    }
                },
                Duration = ToastDuration.Long,
                Audio = new ToastAudio
                {
                    Loop = true,
                    Src = new Uri("ms-winsoundevent:Notification.Looping.Alarm4")
                },
                Actions = new ToastActionsCustom
                {
                    Buttons =
                    {
                        copyToastButton,
                    }                
                }
            }.GetContent();
        }
 

Комментарии:

1. К сожалению, это не работает. ToastButton не содержит определения для щелчка.