如何在MVVM项目中实现notifyicon

Reg*_*gis 5 notifyicon mvvm

我正在尝试在 MVVM 项目中实现一个通知图标(http://www.hardcodet.net/projects/wpf-notifyicon)。我了解此控件旨在用于常规 WPF 项目。

我想知道如何实现气球功能(气球功能)。如本教程中所述,需要调用方法“ShowBallonTip”

//show balloon with built-in icon
  MyNotifyIcon.ShowBalloonTip(title, text, BalloonIcon.Error);
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一可以调用此方法的地方是在后面的代码中。我在后面的视图代码中有一点代码没有问题(即使我不想有任何代码)但我不知道如何让视图模型与视图对话并要求它调用这个方法。

即使我将此方法放在一个事件中,我如何从视图模型以编程方式引发此事件?

知道我怎么能做到这一点吗?

Reg*_*gis 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在我的视图模型中使用了它: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
}
Run Code Online (Sandbox Code Playgroud)

  • 让视图模型了解视图,这是否违反了 MVVM 模式?似乎没有任何方法可以使用此方法在 XAML 中定义图标,然后绑定到触发新气球的属性。 (3认同)