V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yanjinhua
V2EX  ›  C#

WPF 托盘闪烁

  •  
  •   yanjinhua · 2023-01-11 15:55:12 +08:00 · 1135 次点击
    这是一个创建于 714 天前的主题,其中的信息可能已经有所发展或是发生改变。

    WPF 托盘闪烁

    控件名:NotifyIcon

    作者:WPFDevelopersOrg - 弈虎、驚鏵

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

    • 框架使用大于等于.NET40
    • Visual Studio 2022
    • 项目使用 MIT 开源许可协议。
    • 接着上一篇基础托盘
    • 新增如下:
      • 增加属性TwinkInterval托盘图标闪烁间隔默认500msIsTwink = true 开启闪烁。
      • 设计器时不显示托盘。
    • Nuget 最新 Install-Package WPFDevelopers
    • Nuget 最新 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;
            }
    

    鸣谢 - 弈虎

    Github|NotifyIcon
    码云|NotifyIcon

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3051 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:43 · PVG 20:43 · LAX 04:43 · JFK 07:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.