WPF 托盘闪烁
控件名:NotifyIcon
作者:WPFDevelopersOrg - 弈虎、
.NET40
。Visual Studio 2022
。TwinkInterval
托盘图标闪烁间隔默认500ms
,IsTwink = true
开启闪烁。Install-Package WPFDevelopers
Install-Package WPFDevelopers..Minimal
1 )托盘闪烁代码如下:
/// <summary> /// 托盘图标闪烁间隔 /// </summary> public static readonly DependencyProperty TwinkIntervalProperty = DependencyProperty.Register("TwinkInterval", typeof(TimeSpan), typeof(NotifyIcon), new PropertyMetadata(TimeSpan.FromMilliseconds(500), OnTwinkIntervalChanged)); /// <summary> /// 托盘图标是否开启闪烁 /// </summary> public static readonly DependencyProperty IsTwinkProperty = DependencyProperty.Register("IsTwink", typeof(bool), typeof(NotifyIcon), new PropertyMetadata(false, OnIsTwinkChanged)); private static void OnIsTwinkChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is NotifyIcon trayService) { var notifyIcon = (NotifyIcon)d; if (notifyIcon.Visibility != Visibility.Visible) return; if ((bool)e.NewValue) { if (notifyIcon._dispatcherTimerTwink == null) { notifyIcon._dispatcherTimerTwink = new DispatcherTimer { Interval = notifyIcon.TwinkInterval }; notifyIcon._dispatcherTimerTwink.Tick += notifyIcon.DispatcherTimerTwinkTick; } notifyIcon._tempIcOnHandle= notifyIcon._hIcon; notifyIcon._dispatcherTimerTwink.Start(); } else { notifyIcon._dispatcherTimerTwink?.Stop(); notifyIcon._dispatcherTimerTwink.Tick -= notifyIcon.DispatcherTimerTwinkTick; notifyIcon._dispatcherTimerTwink = null; notifyIcon._icOnHandle= notifyIcon._tempIconHandle; notifyIcon.ChangeIcon(false, notifyIcon._iconHandle); notifyIcon._tempIcOnHandle= IntPtr.Zero; } } } private static void OnTwinkIntervalChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is NotifyIcon trayService) { var notifyIcon = (NotifyIcon)d; notifyIcon._dispatcherTimerTwink.Interval = (TimeSpan)e.NewValue; } }
2 )设计器时不显示托盘代码如下:
if (DesignerHelper.IsInDesignMode == true) return false; #region 是否设计时模式 public class DesignerHelper { private static bool? _isInDesignMode; public static bool IsInDesignMode { get { if (!_isInDesignMode.HasValue) { _isInDesignMode = (bool)DependencyPropertyDescriptor.FromProperty(DesignerProperties.IsInDesignModeProperty, typeof(FrameworkElement)).Metadata.DefaultValue; } return _isInDesignMode.Value; } } } #endregion
3 )使用托盘代码如下:
<wpfdev:NotifyIcon Title="WPF 开发者" Name="WpfNotifyIcon"> <wpfdev:NotifyIcon.ContextMenu> <ContextMenu> <MenuItem Header="托盘消息" Click="SendMessage_Click"/> <MenuItem Header="闪烁" Name="menuItemTwink" Click="Twink_Click"/> <MenuItem Header="关于" Click="About_Click"> <MenuItem.Icon> <Path Data="{StaticResource PathWarning}" Fill="{DynamicResource PrimaryNormalSolidColorBrush}" Stretch="Uniform" Height="20" Width="20"/> </MenuItem.Icon> </MenuItem> <MenuItem Header="退出" Click="Quit_Click"/> </ContextMenu> </wpfdev:NotifyIcon.ContextMenu> </wpfdev:NotifyIcon>
4 )事件Twink_Click
代码如下:
private void Twink_Click(object sender, RoutedEventArgs e) { WpfNotifyIcon.IsTwink = !WpfNotifyIcon.IsTwink; menuItemTwink.IsChecked = WpfNotifyIcon.IsTwink; }
鸣谢 - 弈虎