5

MVVM プロジェクトに通知アイコン ( http://www.hardcodet.net/projects/wpf-notifyicon )を実装しようとしています。このコントロールは、通常の WPF プロジェクトで使用することを意図していることを理解しています。

バルーン機能 (バルーン機能)を実装する方法を考えています。このチュートリアルで指定されているように、メソッド「ShowBallonTip」を呼び出す必要があります

//show balloon with built-in icon
  MyNotifyIcon.ShowBalloonTip(title, text, BalloonIcon.Error);

このメソッドを呼び出すことができる唯一の場所は、コード ビハインドです。ビューのコード ビハインドに小さなコードがあることに問題はありませんが (何もないことを好む場合でも)、ビュー モデルにビューと対話させる方法がわかりません。これを呼び出すように依頼します。方法。

このメソッドをイベントに配置したとしても、ビューモデルからプログラムでこのイベントを発生させるにはどうすればよいですか?

どうすればこれを達成できるのでしょうか?

4

4 に答える 4

4

XAMLの代わりにビューモデルでアイコンを初期化することで、バルーンのヒントを表示することができました。

コマンドでShowBalloonTipメソッドを呼び出すだけでうまくいきます。

通知アイコンのラッパーを作成しました:NotifyService:

public class NotifyService : INotifyService
{
    private TaskbarIcon icon = new TaskbarIcon
        {
            Name = "NotifyIcon",
            Icon =
                new System.Drawing.Icon(
                    Application.GetResourceStream(Utils.FileUtils.MakeUri("/Icons/email.ico")).Stream),
        };


    public void Notify(string message)
    {

        icon.ShowBalloonTip("title", message, BalloonIcon.None);
    }

    public void ChangeIconSource(string path)
    {
        icon.Icon = new System.Drawing.Icon(
                    Application.GetResourceStream(Utils.FileUtils.MakeUri(path)).Stream);
    }
}

そして、私はそれを私のビューモデルで使用しました:viewmodel

public class MainWindowViewModel : WindowViewModelBase
{
    private readonly INotifyService notifyService = new NotifyService();

    #region Fields
    private static HomeWindowViewModel homeViewModel = new HomeWindowViewModel();
    #endregion
    /// Initializes a new instance of the <see cref="MainWindowViewModel"/> class.
    /// </summary>
    public MainWindowViewModel()
        : base()
    {
        CurrentViewModel = homeViewModel;
    }

    #region Methods

    protected override void OnViewModelPropertyChanged(IViewModel viewModel, string propertyName)
    {
        int t = 2;
    }

    protected override void OnViewModelCommandExecuted(IViewModel viewModel, ICatelCommand command, object commandParameter)
    {
        int t = 2;
        notifyService.ChangeIconSource(@"/Icons/new_email.ico");
        notifyService.Notify("test");
    }
    #endregion
}
于 2012-09-20T16:19:21.610 に答える
4

あまり明白ではない解決策を見つけましたが、間違いなく MVVM パターンの方が適しています。これにより、TaskbarIcon を XAML で作成し、ViewModel によって新しいバルーン データを供給することができます。

最初に行うことは、TaskbarIcon にバブルを表示させたいことを通知する何らかの機能を追加することです。この目的のために Microsoft の Rx 拡張機能 (NuGet Package Rx-Main) を使用することにしましたが、適切なインフラストラクチャであればどれでも機能します。これは新しい TaskbarIcon クラスで、ShowBubbleTip メソッドが呼び出されたときに渡すデータを保持するためのクラスです。

using Hardcodet.Wpf.TaskbarNotification;
using System;
using System.Windows;
namespace Phi.Utility
{
    public class TaskbarIconRxBallonNotification
    {
        public Hardcodet.Wpf.TaskbarNotification.BalloonIcon Icon
        {
            get;
            private set;
        }
        public string BallonTitle
        {
            get;
            private set;
        }
        public string Message
        {
            get;
            private set;
        }
        public TaskbarIconRxBallonNotification(Hardcodet.Wpf.TaskbarNotification.BalloonIcon icon, string balloonTitle, string message)
        {
            Icon = icon;
            BallonTitle = balloonTitle;
            Message = message;
        }
    }
    public class TaskbarIconRx : TaskbarIcon
    {
        public IObservable<TaskbarIconRxBallonNotification> BalloonTipNotifier
        {
            get { return (IObservable<TaskbarIconRxBallonNotification>)GetValue(BallonTipNotifierProperty); }
            set { SetValue(BallonTipNotifierProperty, value); }
        }

        // Using a DependencyProperty as the backing store for BalloonSubject.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty BallonTipNotifierProperty =
            DependencyProperty.Register("BalloonTipNotifier", typeof(IObservable<TaskbarIconRxBallonNotification>), typeof(TaskbarIconRx), new PropertyMetadata(null, BallonTipNotifierChanged));

        //What to do when we get a new ballonIcon request
        protected void OnNextNotification(TaskbarIconRxBallonNotification notification)
        {
            ShowBalloonTip("", notification.Message, BalloonIcon.Info);
        }
        private IDisposable _subscription;

        //Make sure swapping out bindings doesn't break our program.
        public static void BallonTipNotifierChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            TaskbarIconRx currentNotifier = d as TaskbarIconRx;
            if (currentNotifier != null)
            {
                IObservable<TaskbarIconRxBallonNotification> prev = e.OldValue as IObservable<TaskbarIconRxBallonNotification>;
                IObservable<TaskbarIconRxBallonNotification> next = e.NewValue as IObservable<TaskbarIconRxBallonNotification>;

                if (currentNotifier._subscription != null)
                {
                    currentNotifier._subscription.Dispose();
                    currentNotifier._subscription = null;
                }
                if ((next != null))
                {

                    currentNotifier._subscription = next.Subscribe(currentNotifier.OnNextNotification);
                }
            }
        }

    }
}

モデルでは、バインドする ISubject を提供します

using System.Reactive.Subjects;
namespace Phi.Models {
    public class SomeModel:ModelBase {
        public ISubject<Utility.TaskbarIconRxBallonNotification> NotifierInterface
        {
            get;
            private set;
        }
        public SomeModel() {
            NotifierInterface = new Subject<Utility.TaskbarIconRxBallonNotification>();

        }
    }
}

ViewModel では、次のように、モデル サブジェクトを通じて通知をプッシュできるようになりました。

namespace Phi.ViewModels{
    public class SomeViewModel:ViewModelBase
    {
        public SomeModel Model{
            get;
            private set;
        }
        public void PushNotification(string message)
        {
            //Pushes a new notification to the TaskbarIcon.
            Model.NotifierInterface.OnNext(new Utility.TaskbarIconRxBallonNotification(Hardcodet.Wpf.TaskbarNotification.BalloonIcon.Info, "Title", message));
        }
    }
}

XAML では、モデル ISubject にバインドします。

<Utility:TaskbarIconRx Visibility= IconSource="/Resources/TinyLogo.ico" BalloonTipNotifier="{Binding Model.NotifierInterface}" >
于 2015-04-27T20:36:41.637 に答える
0
TaskbarIcon MyNotifyIcon = new TaskbarIcon();

    private void ShowStandardBalloon()
    {

        if (ping == false)
        {
            string title = "Website is offline!";
            string text = Url;
            MyNotifyIcon.ShowBalloonTip(title, text, BalloonIcon.Error);
        }else if(ping == true)
        {
            string title = "Website is online!";
            string text = Url;
            MyNotifyIcon.ShowBalloonTip(title, text, BalloonIcon.Info);
        }
     }

これを ViewModel に貼り付けて値を変更すると、準備完了です。ShowStandartBallon(); を呼び出すだけです。コードビハインドにコードがありません。

[編集]

TaskbarIcon MyNotifyIcon = new TaskbarIcon();

    private void ShowStandardBalloon()
    {
            string title = "Website is offline!";
            string text = Url; //Url is a String
            MyNotifyIcon.ShowBalloonTip(title, text, BalloonIcon.Error);
    }
于 2016-08-08T11:37:37.767 に答える