WPF 托盘闪烁

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF 托盘闪烁相关的知识,希望对你有一定的参考价值。

 WPF 托盘闪烁

控件名:NotifyIcon

作者:WPFDevelopersOrg  - 弈虎、驚鏵

原文链接:   https://github.com/WPFDevelopersOrg/WPFDevelopers

  • 框架使用大于等于.NET40

  • Visual Studio 2022

  • 项目使用 MIT 开源许可协议。

  • 接着上一篇基础托盘

  • 新增如下:

    • 增加属性TwinkInterval托盘图标闪烁间隔默认500msIsTwink = true 开启闪烁。

    • 设计器时不显示托盘。

  • Nuget 最新[1]Install-Package WPFDevelopers 1.0.9.2-preview

  • Nuget 最新[2]Install-Package WPFDevelopers..Minimal 3.2.8.2-preview

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;
        

 鸣谢 - 弈虎

Github|NotifyIcon[3]
码云|NotifyIcon[4]

参考资料

[1]

Nuget : https://www.nuget.org/packages/WPFDevelopers/

[2]

Nuget : https://www.nuget.org/packages/WPFDevelopers.Minimal/

[3]

Github|NotifyIcon: https://github.com/WPFDevelopersOrg/WPFDevelopers/blob/master/src/WPFDevelopers.Samples/ExampleViews/MainWindow.xaml

[4]

码云|NotifyIcon: https://gitee.com/WPFDevelopersOrg/WPFDevelopers/blob/master/src/WPFDevelopers.Samples/ExampleViews/MainWindow.xaml

以上是关于WPF 托盘闪烁的主要内容,如果未能解决你的问题,请参考以下文章

WPF 在关闭程序了之后,托盘图标依然存在,请问怎么解决?

WPF - 将应用程序从系统托盘置于最前面

WPF之托盘图标的设定

只有托盘图标的 WPF 应用程序

WPF 基础控件之托盘

如何从另一个应用程序关闭 WPF 系统托盘应用程序?