#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 не содержит определения для щелчка.