hardcodet / wpf-notifyicon

NotifyIcon (aka system tray icon or taskbar icon) for the WPF platform
Other
810 stars 125 forks source link

Update TaskbarIcon.Declarations.cs #60

Open Tetley22 opened 2 years ago

Tetley22 commented 2 years ago

Added support for dynamic, in-memory icons to be assigned at the xaml level. This allows better support for MVVM design.

For a small wpf project I created, I wanted the ability to generate icons at runtime, while maintaining MVVM design pattern. The only way I could figure out how to assign dynamic in-memory icons was to break MVVM and access the TaskbarIcon object directly in the ViewModel code. So I added this ability which worked well for my needs, and thought I'd share if you are interested in it.

Usage in xaml:

        <tb:TaskbarIcon
            x:Name ="ToolbarIcon"
            **IconInMemory="{Binding TrayIcon}"**
           ... />

In ViewModel (where TrayIcon is set via dynamic icon generation): public Icon TrayIcon { get { return _trayIcon; } set { _trayIcon = value; NotifyPropertyChanged(nameof(TrayIcon)); } }

Lakritzator commented 1 year ago

Thank you for sharing this PR, sorry for the delay but I have a lot of my plate.

I see a bit of an issue with this change, an Icon is a IDisposable, so it needs to be disposed otherwise a memory leak will happen. The OnIconInMemoryPropertyChanged will overwrite it, and not allow it to be disposed.

The issue is that sometimes an icon needs to be disposed and sometimes not (as you will need it), and for these scenarios we might want to have a better solution. I know there were some other issues with icons, I need to consolidate all of that to come up with one... bear with me.