WPF 托盘闪烁
控件名:NotifyIcon
作者: WPFDevelopersOrg – 弈虎、驚鏵
原文链接: https://github.com/WPFDevelopersOrg/WPFDevelopers
-
框架使用大于等于 .NET40
。 -
Visual Studio 2022
。 -
项目使用 MIT 开源许可协议。 -
接着上一篇基础托盘。 -
新增如下: -
增加属性 TwinkInterval
托盘图标闪烁间隔默认500ms
,IsTwink = 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]
参考资料
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 托盘闪烁
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/54940.html