隐藏窗体任务栏图标

/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
this.ShowInTaskbar = false;
}
}

系统图标类

  public class SystemTray
{
public static SystemTray Instance;
/// <summary>
/// 静态构造函数,在类第一次被创建或者静态成员被调用的时候调用
/// </summary>
static SystemTray()
{
Instance=new SystemTray();
} public NotifyIcon Ni { get; set; } private SystemTray()
{
Ni = new System.Windows.Forms.NotifyIcon();
Stream iconStream = Application.GetResourceStream(new Uri("pack://application:,,,/StikyNotes;component/MyLogo.ico")).Stream;
Ni.Icon = new System.Drawing.Icon(iconStream);
Ni.Visible = true;
Ni.MouseClick += Ni_MouseClick;
} private void Ni_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
System.Windows.Controls.ContextMenu NotifyIconMenu = (System.Windows.Controls.ContextMenu)App.Current.FindResource("NotifyIconMenu");
NotifyIconMenu.IsOpen = true;
App.Current.MainWindow?.Activate();
} if (e.Button == MouseButtons.Left)
{
var wins=WindowsManager.Instance.Windows;
foreach (var i in wins)
{
i.Activate();
}
}
} /// <summary>
/// 销毁系统托盘图标的资源
/// </summary>
public void DisposeNotifyIcon()
{
Ni?.Dispose();
}
}

在App.xaml中:

 public partial class App : Application
{
System.Threading.Mutex mutex;
protected override void OnStartup(StartupEventArgs e)
{
bool ret;
mutex = new System.Threading.Mutex(true, "StikyNotesAPP", out ret); if (!ret)
{
MessageBox.Show("程序已经运行了");
Environment.Exit(0);
} base.OnStartup(e);
var systemtray = SystemTray.Instance;
} protected override void OnDeactivated(EventArgs e)
{
base.OnDeactivated(e);
System.Windows.Controls.ContextMenu menu = this.FindResource("NotifyIconMenu") as ContextMenu;
if (menu.IsOpen == true)
{
menu.IsOpen = false;
} } /// <summary>
/// 新建窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuOpen_Click(object sender, RoutedEventArgs e)
{
var MainWindow = new MainWindow();
MainWindow.DataContext = new MainViewModel(MainWindow, new WindowsData());
WindowsManager.Instance.Windows.Add(MainWindow);
MainWindow.Show();
} /// <summary>
/// 窗体退出
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuExit_Click(object sender, RoutedEventArgs e)
{
SystemTray.Instance.DisposeNotifyIcon();
App.Current.Shutdown();
}
/// <summary>
/// 窗体退出事件
/// </summary>
/// <param name="e"></param>
protected override void OnExit(ExitEventArgs e)
{
base.OnExit(e);
XMLHelper.SaveObjAsXml(ProgramData.Instance, "StikyNotesData.xml");
SystemTray.Instance.DisposeNotifyIcon(); } private void Application_Startup(object sender, StartupEventArgs e)
{
var programData = XMLHelper.DecodeXML<ProgramData>("StikyNotesData.xml");
if (programData != null)
{
var windowsDatas = programData.Datas;
ProgramData.Instance.IsWindowTopMost = programData.IsWindowTopMost;
ProgramData.Instance.IsStartUpWithSystem = programData.IsStartUpWithSystem;
MainWindow MainWindow;
//有创建过的窗口
if (windowsDatas.Count > 0)
{
for (int i = 0; i < windowsDatas.Count; i++)
{
MainWindow = new MainWindow();
MainWindow.DataContext = new MainViewModel(MainWindow, windowsDatas[i]);
MainWindow.Show();
}
}
else//以前的窗口都被删掉了
{
MainWindow = new MainWindow();
MainWindow.DataContext = new MainViewModel(MainWindow, new WindowsData());
MainWindow.Show();
}
}
//没有创建过的窗口
else
{
var MainWindow = new MainWindow();
MainWindow.DataContext = new MainViewModel(MainWindow, new WindowsData());
MainWindow.Show();
}
}
}

App.xaml中

 <ContextMenu x:Key="NotifyIconMenu" StaysOpen="False">
<MenuItem
Name="MenuOpen"
Click="MenuOpen_Click"
Header="新建" />
<MenuItem
Name="MenuExit"
Click="MenuExit_Click"
Header="退出" />
</ContextMenu>

问题

记得在退出的时候要释放使用的图标资源,否则在程序退出之后,系统栏中还会存在小图标,要使用下面这条语句:

SystemTray.Instance.DisposeNotifyIcon();

效果

最新文章

  1. Angular 2.0 的设计方法和原则
  2. Atitit vod click event design flow &#160;视频点播系统点击事件文档
  3. .NET Framework源码查看及下载
  4. EF框架批量更新
  5. .net framework 注册到IIS上
  6. Lintcode--009(单词切分)
  7. 【转】搭建自己的 sentry 服务
  8. asp.net mvc 使用 Autocomplete 实现类似百度,谷歌动态搜索条提示框。
  9. java.lang.IllegalArgumentException: Invalid source &#39;classpath:spring-mvc.xml&#39;
  10. Redis多机多节点集群实验
  11. 小程序View内的文字不换行
  12. 在ubuntu上安装运行ionic项目
  13. WPF 对控件进行截图且不丢失范围(转载)
  14. bash变量详解
  15. 搭建ELK集群
  16. binlog介绍
  17. MyEclipse WebSphere开发教程:安装和更新WebSphere 6.1, JAX-WS, EJB 3.0(一)
  18. linux命令总结kill命令详解
  19. hiho 1227 找到一个恰好包含n个点的圆 (2015北京网赛 A题)
  20. Java 中的 int 与 Integer 用于 List&amp;lt;Integer&amp;gt; 时,以及通过打印变量检測程序执行和函数调用次数计数

热门文章

  1. Mysql知识点整理
  2. go-zero docker-compose 搭建课件服务(五):完善user服务
  3. spring框架-jdbcTemplate
  4. Python基础之面向对象:1、面向对象及编程思想
  5. python的list,dict,set
  6. NC-UClient下载安装应用详解
  7. 2022春每日一题:Day 33
  8. ROSIntegration ROSIntegrationVision与虚幻引擎4(Unreal Engine 4)的配置
  9. [ PHP 内核与扩展开发系列] 内存管理 —— 引用计数
  10. 【云原生 · Kubernetes】Taint和Toleration(污点和容忍)