{"id":590,"date":"2020-01-12T21:46:03","date_gmt":"2020-01-12T12:46:03","guid":{"rendered":"http:\/\/marius.main.jp\/software\/blog\/?p=590"},"modified":"2021-03-14T05:40:04","modified_gmt":"2021-03-13T20:40:04","slug":"post-590","status":"publish","type":"post","link":"https:\/\/todosoft.net\/blog\/?p=590","title":{"rendered":"ToastNotifications\u3092\u7528\u3044\u305f\u901a\u77e5\u8868\u793a"},"content":{"rendered":"\n<p><a href=\"https:\/\/github.com\/rafallopatka\/ToastNotifications\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"ToastNotifications (\u65b0\u3057\u3044\u30bf\u30d6\u3067\u958b\u304f)\">ToastNotifications<\/a><\/p>\n\n\n\n<p>\u306a\u304a\u3001ToastNotifications\u306b\u306f\u3001MessageOptions\u5185\u306bNotificationClickAction\u3068\u3044\u3046\u30af\u30ea\u30c3\u30af\u901a\u77e5\u7528\u30a2\u30af\u30b7\u30e7\u30f3\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u308b\u304c\u3001<br>\u3046\u307e\u304f\u52d5\u4f5c\u3057\u306a\u304b\u3063\u305f\u305f\u3081\u3001\u4ee3\u66ff\u51e6\u7406\u3092\u884c\u3063\u3066\u3044\u308b\u3002<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">WpfApp23<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">ViewMainView.xaml<\/h3>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-csharp\"><code class=\"language-csharp\">&lt;Window x:Class=\"WpfApp23.View.MainView\"\n        xmlns=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation\"\n        xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\"\n        xmlns:d=\"http:\/\/schemas.microsoft.com\/expression\/blend\/2008\"\n        xmlns:mc=\"http:\/\/schemas.openxmlformats.org\/markup-compatibility\/2006\"\n        xmlns:i=\"http:\/\/schemas.microsoft.com\/xaml\/behaviors\"\n        xmlns:l=\"http:\/\/schemas.livet-mvvm.net\/2011\/wpf\"\n        xmlns:local=\"clr-namespace:WpfApp23.View\"\n        xmlns:vm=\"clr-namespace:WpfApp23.ViewModel\"\n        mc:Ignorable=\"d\"\n        Title=\"MainView\" Height=\"200\" Width=\"400\">\n\n    &lt;Window.DataContext>\n        &lt;vm:MainViewModel\/>\n    &lt;\/Window.DataContext>\n\n    &lt;i:Interaction.Triggers>\n        &lt;i:EventTrigger EventName =\"ContentRendered\">\n            &lt;l:LivetCallMethodAction MethodTarget=\"{Binding}\" MethodName=\"OnContentRendered\" \/>\n        &lt;\/i:EventTrigger>\n        &lt;i:EventTrigger EventName =\"Closing\">\n            &lt;l:LivetCallMethodAction MethodTarget=\"{Binding}\" MethodName=\"OnClosing\" \/>\n        &lt;\/i:EventTrigger>\n    &lt;\/i:Interaction.Triggers>\n\n    &lt;Grid>\n        &lt;Button Content=\"ShowToast\" Margin=\"110,45,177,39\">\n            &lt;i:Interaction.Triggers>\n                &lt;i:EventTrigger EventName=\"Click\">\n                    &lt;l:LivetCallMethodAction MethodTarget=\"{Binding}\" MethodName=\"OnButtonClicked\" \/>\n                &lt;\/i:EventTrigger>\n            &lt;\/i:Interaction.Triggers>\n        &lt;\/Button>\n    &lt;\/Grid>\n&lt;\/Window><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"> ViewMainView.xaml.cs<\/h3>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-csharp\"><code class=\"language-csharp\">using System.Windows;\n\nnamespace WpfApp23.View\n{\n    \/\/\/ &lt;summary>\n    \/\/\/ MainView.xaml \u306e\u76f8\u4e92\u4f5c\u7528\u30ed\u30b8\u30c3\u30af\n    \/\/\/ &lt;\/summary>\n    public partial class MainView : Window\n    {\n        public MainView()\n        {\n            InitializeComponent();\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ViewModelMainViewModel.cs<\/h3>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-csharp\"><code class=\"language-csharp\">using MaterialNotification.Model;\nusing System;\n\nnamespace WpfApp23.ViewModel\n{\n    public class MainViewModel : Livet.ViewModel\n    {\n        private NotificationModel notificationModel = null;\n\n        public void OnContentRendered()\n        {\n            notificationModel = new NotificationModel();\n        }\n\n        public void OnClosing()\n        {\n            if (notificationModel != null)\n                notificationModel.Dispose();\n        }\n\n        public void OnButtonClicked()\n        {\n            notificationModel.ShowNotification(\"\u30bf\u30a4\u30c8\u30eb\", DateTime.Now.ToString(\"yyyy\/MM\/dd HH:mm:ss\")).Clicked += (object sender, EventArgs e) =>\n            {\n            };\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">MaterialNotification<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">ModelNotificationClickModel.cs<\/h3>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-csharp\"><code class=\"language-csharp\">using System;\n\nnamespace MaterialNotification.Model\n{\n    public class NotificationClickModel\n    {\n        public event EventHandler Clicked;\n\n        public void RaiseClickEvent()\n        {\n            if (Clicked != null)\n                Clicked(this, EventArgs.Empty);\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ModelNotificationModel.cs<\/h3>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-csharp\"><code class=\"language-csharp\">using System;\nusing ToastNotifications;\nusing ToastNotifications.Lifetime;\nusing ToastNotifications.Position;\nusing MaterialNotification.ViewModel;\nusing System.Windows.Threading;\n\nnamespace MaterialNotification.Model\n{\n    public class NotificationModel : IDisposable\n    {\n        private Notifier notifier = null;\n\n        public NotificationModel()\n        {\n            notifier = new Notifier(config =>\n            {\n                config.LifetimeSupervisor = new TimeAndCountBasedLifetimeSupervisor(TimeSpan.FromSeconds(5), MaximumNotificationCount.FromCount(5));\n                config.PositionProvider = new PrimaryScreenPositionProvider(Corner.BottomRight, 10, 10);\n                config.Dispatcher = Dispatcher.CurrentDispatcher;\n            });\n        }\n\n        public void Dispose()\n        {\n            if (notifier != null)\n                notifier.Dispose();\n        }\n\n        public NotificationClickModel ShowNotification(string title, string message)\n        {\n            NotificationClickModel notificationClickModel = new NotificationClickModel();\n            notifier.ShowNotification(title, message).Clicked += (object sender, EventArgs e) =>\n            {\n                notificationClickModel.RaiseClickEvent();\n            };\n\n            return notificationClickModel;\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ViewNotificationView.xaml<\/h3>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-csharp\"><code class=\"language-csharp\">&lt;core:NotificationDisplayPart\n        x:Class=\"MaterialNotification.View.NotificationView\"\n        xmlns=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation\"\n        xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\"\n        xmlns:d=\"http:\/\/schemas.microsoft.com\/expression\/blend\/2008\"\n        xmlns:mc=\"http:\/\/schemas.openxmlformats.org\/markup-compatibility\/2006\"\n        xmlns:local=\"clr-namespace:MaterialNotification.View\"\n        xmlns:core=\"clr-namespace:ToastNotifications.Core;assembly=ToastNotifications\"\n        mc:Ignorable=\"d\"\n        d:DesignHeight=\"120\" d:DesignWidth=\"250\" Background=\"Black\" Opacity=\"0.85\" Cursor=\"Hand\">\n\n    &lt;Grid Margin=\"10\">\n        &lt;Grid.ColumnDefinitions>\n            &lt;ColumnDefinition Width=\"*\"\/>\n        &lt;\/Grid.ColumnDefinitions>\n        &lt;Grid.RowDefinitions>\n            &lt;RowDefinition Height=\"Auto\"\/>\n            &lt;RowDefinition Height=\"*\" \/>\n        &lt;\/Grid.RowDefinitions>\n\n        &lt;TextBlock Grid.Row=\"0\" Grid.Column=\"0\" Text=\"{Binding Title}\" Foreground=\"White\" FontSize=\"17\"\/>\n        &lt;TextBlock Grid.Row=\"1\" Grid.Column=\"0\" Grid.ColumnSpan=\"2\" Text=\"{Binding Message}\" Foreground=\"White\" TextWrapping=\"Wrap\"\/>\n    &lt;\/Grid>\n&lt;\/core:NotificationDisplayPart><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ViewNotificationView.xaml.cs<\/h3>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-csharp\"><code class=\"language-csharp\">using ToastNotifications.Core;\n\nnamespace MaterialNotification.View\n{\n    \/\/\/ &lt;summary>\n    \/\/\/ NotificationView.xaml \u306e\u76f8\u4e92\u4f5c\u7528\u30ed\u30b8\u30c3\u30af\n    \/\/\/ &lt;\/summary>\n    public partial class NotificationView : NotificationDisplayPart\n    {\n        public NotificationView(ViewModel.NotificationViewModel notificationViewModel)\n        {\n            InitializeComponent();\n            Bind(notificationViewModel);\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ViewModelNotificationViewModel.cs<\/h3>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-csharp\"><code class=\"language-csharp\">using System;\nusing System.ComponentModel;\nusing System.Runtime.CompilerServices;\nusing ToastNotifications.Core;\n\nnamespace MaterialNotification.ViewModel\n{\n    public class NotificationViewModel : NotificationBase, INotifyPropertyChanged\n    {\n        public event EventHandler Clicked;\n\n        private View.NotificationView notificationView = null;\n\n        public override NotificationDisplayPart DisplayPart => notificationView;\n\n        public NotificationViewModel(string title, string message, MessageOptions messageOptions) : base(message, messageOptions)\n        {\n            Title = title;\n            Message = message;\n\n            notificationView = new View.NotificationView(this);\n            notificationView.MouseDown += (object sender, System.Windows.Input.MouseButtonEventArgs e) =>\n            {\n                if (Clicked != null)\n                    Clicked(this, EventArgs.Empty);\n            };\n        }\n\n        private string _title;\n        public string Title\n        {\n            get\n            {\n                return _title;\n            }\n            set\n            {\n                _title = value;\n                OnPropertyChanged();\n            }\n        }\n\n        private string _message;\n        public string Message\n        {\n            get\n            {\n                return _message;\n            }\n            set\n            {\n                _message = value;\n                OnPropertyChanged();\n            }\n        }\n\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)\n        {\n            var handler = PropertyChanged;\n            if (handler != null)\n                handler.Invoke(this, new PropertyChangedEventArgs(propertyName));\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ViewModelNotificationViewModelExtensions.cs<\/h3>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-csharp\"><code class=\"language-csharp\">using ToastNotifications;\nusing ToastNotifications.Core;\n\nnamespace MaterialNotification.ViewModel\n{\n    public static class NotificationViewModelExtensions\n    {\n        public static NotificationViewModel ShowNotification(this Notifier notifier, string title, string message, MessageOptions messageOptions = null)\n        {\n            NotificationViewModel notificationViewModel = new NotificationViewModel(title, message, messageOptions);\n            notifier.Notify(() => notificationViewModel);\n\n            return notificationViewModel;\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>ToastNotifications \u306a\u304a\u3001ToastNotifications\u306b\u306f\u3001MessageOptions\u5185\u306bNotificationClickAction\u3068\u3044\u3046\u30af\u30ea\u30c3\u30af\u901a\u77e5\u7528\u30a2\u30af\u30b7\u30e7\u30f3\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u308b\u304c\u3001\u3046\u307e\u304f [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19,20,15],"tags":[58,57],"class_list":["post-590","post","type-post","status-publish","format-standard","hentry","category-c","category-wpf","category-15","tag-toastnotifications","tag-57"],"_links":{"self":[{"href":"https:\/\/todosoft.net\/blog\/index.php?rest_route=\/wp\/v2\/posts\/590","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/todosoft.net\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/todosoft.net\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/todosoft.net\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/todosoft.net\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=590"}],"version-history":[{"count":5,"href":"https:\/\/todosoft.net\/blog\/index.php?rest_route=\/wp\/v2\/posts\/590\/revisions"}],"predecessor-version":[{"id":697,"href":"https:\/\/todosoft.net\/blog\/index.php?rest_route=\/wp\/v2\/posts\/590\/revisions\/697"}],"wp:attachment":[{"href":"https:\/\/todosoft.net\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/todosoft.net\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=590"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/todosoft.net\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}