原版是从网上找了一位大神的,自己只是用了一点适合自己的。

具体实现

1.首先已经确认WPF中没有实现最小化托盘的类与方法,用到了winform中的程序集

using Drawing = System.Drawing;
using Forms = System.Windows.Forms;

2.XAML的后代相应事件的Demo,只是为了看起来方便~!其中也包含了在任务栏中不现实图标,只在托盘中显示。双击实现窗口的还原。没用到大神写的,自己琢磨了个,令人想不到的蛋疼的后果还没出现,也就暂时这样了。

 namespace 最小化到托盘
 {
     /// <summary>
     /// MainWindow.xaml 的交互逻辑
     /// </summary>
     public partial class MainWindow : Window
     {
         public MainWindow()
         {
             //妈蛋找了你一天,,启动后不现实任务栏图标!!!!!!!!!!!!!!!!!!!!
             this.ShowInTaskbar = false;
             InitializeComponent();
         }
         /// <summary>
         /// 托盘右击菜单--上线按钮
         /// </summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
         private void MenuItem_OnlineClick(object sender, EventArgs e)
         {
             MessageBox.Show("提示上线!");
         }

         /// <summary>
         /// 托盘右击菜单--离开按钮
         /// </summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
         private void MenuItem_LeaveClick(object sender, EventArgs e)
         {
             MessageBox.Show("提示暂时离开!");
         }
         /// <summary>
         /// 托盘右击菜单--在忙按钮
         /// </summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
         private void MenuItem_BusyClick(object sender, EventArgs e)
         {
             MessageBox.Show("提示在忙!");
         }
         /// <summary>
         /// 托盘右击菜单--请勿打扰按钮
         /// </summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
         private void MenuItem_NoBotherClick(object sender, EventArgs e)
         {
             MessageBox.Show("提示请勿打扰!");
         }
         /// <summary>
         /// 托盘右击菜单--隐身按钮
         /// </summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
         private void MenuItem_HideClick(object sender, EventArgs e)
         {
             MessageBox.Show("提示隐身!");
         }
         /// <summary>
         /// 托盘右击菜单--离线按钮
         /// </summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
         private void MenuItem_OffLineClick(object sender, EventArgs e)
         {
             MessageBox.Show("提示离线!");
         }
         /// <summary>
         /// 托盘右击菜单--关于我们按钮
         /// </summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
         private void MenuItem_AboutUsClick(object sender, EventArgs e)
         {
             MessageBox.Show("提示关于我们!");
         }
         /// <summary>
         /// 托盘小图标的双击事件--最小化的状态下双击还原
         /// </summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
         private void NotificationAreaIcon_MouseDoubleClick_1(object sender, MouseButtonEventArgs e)
         {
             //if (e.ChangedButton==MouseButton.Left)
             //{
                 if (this.WindowState == WindowState.Minimized)
                 {
                     WindowState = WindowState.Normal;
                 }
            // }
         }

         private void MenuItem_ExitClick(object sender, EventArgs e)
         {
             this.Close();
         }

         private void Window_MouseMove_1(object sender, MouseEventArgs e)
         {
         }

         //以下代码想实现即时聊天的记住密码功能,度娘说要存入配置文件,没搞成功,希望看到的人帮我这个忙~
         private void Button_Click_1(object sender, RoutedEventArgs e)
         {
             //点击按钮往配置文件存入信息
             Configuration cfa = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
             cfa.AppSettings.Settings[";
             cfa.Save();
             MessageBox.Show(ConfigurationManager.AppSettings["LogName"]);
         }
     }
 }

3.最主要的是大神写的这个类,学习编程五个月,能看懂的不是太多,稍微明白点意思,但是说不上来,直接贴代码吧。以后在研究!

 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Windows;
 using System.Windows.Input;
 using System.Windows.Markup;
 using System.Windows.Media;
 using System.Windows.Threading;
 using Drawing = System.Drawing;
 using Forms = System.Windows.Forms;

 namespace 最小化到托盘
 {
     /// <summary>
     /// Represents a thin wrapper for <see cref="Forms.NotifyIcon"/>
     /// </summary>
     [ContentProperty("Text")]
     [DefaultEvent("MouseDoubleClick")]
     public class NotificationAreaIcon : FrameworkElement
     {
         Forms.NotifyIcon notifyIcon;

         public static readonly RoutedEvent MouseClickEvent = EventManager.RegisterRoutedEvent(
             "MouseClick", RoutingStrategy.Bubble, typeof(MouseButtonEventHandler), typeof(NotificationAreaIcon));

         public static readonly RoutedEvent MouseDoubleClickEvent = EventManager.RegisterRoutedEvent(
             "MouseDoubleClick", RoutingStrategy.Bubble, typeof(MouseButtonEventHandler), typeof(NotificationAreaIcon));

         public static readonly DependencyProperty IconProperty =
             DependencyProperty.Register("Icon", typeof(ImageSource), typeof(NotificationAreaIcon));

         public static readonly DependencyProperty TextProperty =
             DependencyProperty.Register("Text", typeof(string), typeof(NotificationAreaIcon));

         public static readonly DependencyProperty FormsContextMenuProperty =
             DependencyProperty.Register("MenuItems", typeof(List<Forms.MenuItem>), typeof(NotificationAreaIcon), new PropertyMetadata(new List<Forms.MenuItem>()));

         protected override void OnInitialized(EventArgs e)
         {
             base.OnInitialized(e);

             // Create and initialize the window forms notify icon based
             notifyIcon = new Forms.NotifyIcon();
             notifyIcon.Text = Text;
             if (!DesignerProperties.GetIsInDesignMode(this))
             {
                 notifyIcon.Icon = FromImageSource(Icon);
             }
             notifyIcon.Visible = FromVisibility(Visibility);

             )
             {
                 notifyIcon.ContextMenu = new System.Windows.Forms.ContextMenu(this.MenuItems.ToArray());
             }

             notifyIcon.MouseDown += OnMouseDown;
             notifyIcon.MouseUp += OnMouseUp;
             notifyIcon.MouseClick += OnMouseClick;
             notifyIcon.MouseDoubleClick += OnMouseDoubleClick;

             Dispatcher.ShutdownStarted += OnDispatcherShutdownStarted;
         }

         private void OnDispatcherShutdownStarted(object sender, EventArgs e)
         {
             notifyIcon.Dispose();
         }

         private void OnMouseDown(object sender, Forms.MouseEventArgs e)
         {
             OnRaiseEvent(MouseDownEvent, new MouseButtonEventArgs(
                 InputManager.Current.PrimaryMouseDevice, , ToMouseButton(e.Button)));
         }

         private void OnMouseUp(object sender, Forms.MouseEventArgs e)
         {
             OnRaiseEvent(MouseUpEvent, new MouseButtonEventArgs(
                 InputManager.Current.PrimaryMouseDevice, , ToMouseButton(e.Button)));
         }

         private void OnMouseDoubleClick(object sender, Forms.MouseEventArgs e)
         {
             OnRaiseEvent(MouseDoubleClickEvent, new MouseButtonEventArgs(
                 InputManager.Current.PrimaryMouseDevice, , ToMouseButton(e.Button)));
         }

         private void OnMouseClick(object sender, Forms.MouseEventArgs e)
         {
             OnRaiseEvent(MouseClickEvent, new MouseButtonEventArgs(
                 InputManager.Current.PrimaryMouseDevice, , ToMouseButton(e.Button)));
         }

         private void OnRaiseEvent(RoutedEvent handler, MouseButtonEventArgs e)
         {
             e.RoutedEvent = handler;
             RaiseEvent(e);
         }

         public List<Forms.MenuItem> MenuItems
         {
             get { return (List<Forms.MenuItem>)GetValue(FormsContextMenuProperty); }
             set { SetValue(FormsContextMenuProperty, value); }
         }

         public ImageSource Icon
         {
             get { return (ImageSource)GetValue(IconProperty); }
             set { SetValue(IconProperty, value); }
         }

         public string Text
         {
             get { return (string)GetValue(TextProperty); }
             set { SetValue(TextProperty, value); }
         }

         public event MouseButtonEventHandler MouseClick
         {
             add { AddHandler(MouseClickEvent, value); }
             remove { RemoveHandler(MouseClickEvent, value); }
         }

         public event MouseButtonEventHandler MouseDoubleClick
         {
             add { AddHandler(MouseDoubleClickEvent, value); }
             remove { RemoveHandler(MouseDoubleClickEvent, value); }
         }

         #region Conversion members

         private static Drawing.Icon FromImageSource(ImageSource icon)
         {
             if (icon == null)
             {
                 return null;
             }
             Uri iconUri = new Uri(icon.ToString());
             return new Drawing.Icon(Application.GetResourceStream(iconUri).Stream);
         }

         private static bool FromVisibility(Visibility visibility)
         {
             return visibility == Visibility.Visible;
         }

         private MouseButton ToMouseButton(Forms.MouseButtons button)
         {
             switch (button)
             {
                 case Forms.MouseButtons.Left:
                     return MouseButton.Left;
                 case Forms.MouseButtons.Right:
                     return MouseButton.Right;
                 case Forms.MouseButtons.Middle:
                     return MouseButton.Middle;
                 case Forms.MouseButtons.XButton1:
                     return MouseButton.XButton1;
                 case Forms.MouseButtons.XButton2:
                     return MouseButton.XButton2;
             }
             throw new InvalidOperationException();
         }

         #endregion Conversion members
     }
 }

WPF实现窗口最小化到托盘,并且实现右击菜单的更多相关文章

  1. WinForm 之 窗口最小化到托盘及右键图标显示菜单

    Form最小化是指整个Form都缩小到任务栏上,但是窗体以Form的标题栏形式显示在任务栏上, 若是想让Form以Icon的形式显示在任务栏右下角,则需要给Form添加一个NotifyIcon控件. ...

  2. NotifyIcon 将窗口最小化到托盘

    1.设置窗体属性showinTask=false 2.加notifyicon控件notifyIcon1,为控件notifyIcon1的属性Icon添加一个icon图标. 3.添加窗体最小化事件(首先需 ...

  3. C# WinForm窗口最小化到系统托盘

    * C# WinForm窗口最小化到系统托盘http://hi.baidu.com/kfxtgtqyapouyze/item/8ccfdcd5a174a7312a35c7c3 主要功能:(1).程序启 ...

  4. MFC窗口实现最小化到托盘 右键菜单和还原

    //.h文件 void toTray();//最小化到托盘 void DeleteTray();//删除托盘图标 afx_msg LRESULT OnShowTask(WPARAM wParam,LP ...

  5. wpf 窗口最小化后,触发某事件弹出最小化窗口并置顶

    //如果窗口最小化了弹出并置顶----事件触发调用 ShowWindowAsync(new System.Windows.Interop.WindowInteropHelper(CommonHelpe ...

  6. C#实现窗口最小化到系统托盘

    先添加notifyicon控件notifyIcon1 using System; using System.Collections.Generic; using System.ComponentMod ...

  7. C# 实现WinForm窗口最小化到系统托盘代码

    1.如果不想让程序在任务栏中显示,请把窗体的属性ShowInTaskbar设置为false; 2.如果想让程序启动时就最小化,请设置窗体的属性WindowState设置为Minimized.(Mini ...

  8. C++ 最小化到托盘

    #define WM_SHOWTASK (WM_USER + 1) void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID &a ...

  9. VC++ 最小化到托盘、恢复

    所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分.在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区. 一.托盘编程相关函数   ...

随机推荐

  1. 使用jsonpath解析json内容

    JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容.下面我把官网介绍的每个表达式用代码实现,可以更直观的知道该怎么用它. 一.首先需要 ...

  2. 深搜+回溯 POJ 2676 Sudoku

    POJ 2676 Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17627   Accepted: 8538 ...

  3. 项目回顾2-vue的初体验-在已有项目局部使用vue,无须额外配置

    当了解到尤大大的vue的时候,就很想在项目里用一下,不过当用了vue cli 创建了一个脚手架之后,感觉现有的项目改造难度太大了,毕竟原来是JQ的.这个项目已经上线,基本功能也完成了,客户提出来后台对 ...

  4. python中BeautifulSoup库中find函数

    http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html#contents 简单的用法: find(name, at ...

  5. UVA 12532 Interval Product

    线段树水题,忽略每个数的大小,只记住他们的正负即可,规规矩矩的代码.不过这是我第一次完全自己写的一次A的代码了.纪念一下... #include <iostream> #include & ...

  6. WEB安全测试之XSS攻击

    目录结构 1.背景知识 2.XSS漏洞的分类 3.XSS防御 4.如何测试XSS漏洞 5.HTML Encode 6.浏览器中的XSS过滤器 7.ASP.NET中的XSS安全机制 一.背景知识 1.什 ...

  7. webpack htmlWebpackPlugin 静态资源 版本控制

    plugins: [ new webpack.optimize.UglifyJsPlugin({ // 压缩webpack 后生成的代码较长时间,通常推到生产环境中才使用 compress:{ war ...

  8. xcode的菜单栏功能解析

    [Xcode 7.2]Xcode菜单栏之你不知道的那点事 File: New : 可以新建tap,窗口,新文件,playground,workspace,target等等. Add Files to ...

  9. tiff或tif文件的读取

    以下是VC下读取TIFF文件的代码 char* szFileName = "K:\\地图\\fujian-DEM\\fujian1.tif"; TIFF* tiff = TIFFO ...

  10. WinForm编程数据视图之DataGridView浅析

    学习C#语言的朋友们肯定或多或少地接触到了WinForm编程,在C#语言的可视化IDE中(如VS.NET中)使用设计器可以让我们轻松地完成窗体.按钮.标签.图片框等等控件的组合,我们可以轻易地做出界面 ...