zoukankan      html  css  js  c++  java
  • WPF应用程序最小化到系统托盘

    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 WpfApplication1
    {
        /// <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);
    
                if (this.MenuItems != null && this.MenuItems.Count > 0)
                {
                    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, 0, ToMouseButton(e.Button)));
            }
    
            private void OnMouseUp(object sender, Forms.MouseEventArgs e)
            {
                OnRaiseEvent(MouseUpEvent, new MouseButtonEventArgs(
                    InputManager.Current.PrimaryMouseDevice, 0, ToMouseButton(e.Button)));
            }
    
            private void OnMouseDoubleClick(object sender, Forms.MouseEventArgs e)
            {
                OnRaiseEvent(MouseDoubleClickEvent, new MouseButtonEventArgs(
                    InputManager.Current.PrimaryMouseDevice, 0, ToMouseButton(e.Button)));
            }
    
            private void OnMouseClick(object sender, Forms.MouseEventArgs e)
            {
                OnRaiseEvent(MouseClickEvent, new MouseButtonEventArgs(
                    InputManager.Current.PrimaryMouseDevice, 0, 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
        }
    }
     

     xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

       <utils:NotificationAreaIcon
                Text="NotificationAreaApplication1"
                          Icon="/Gemr;component/App.ico"
                          MouseDoubleClick="OnNotificationAreaIconDoubleClick" Grid.Row="2">
                    <utils:NotificationAreaIcon.MenuItems>
                        <!--Click="OnMenuItemOpenClick"-->
                        <forms:MenuItem Text="Re-login" Click="OnReLoginClick"  DefaultItem="True" />
                        <forms:MenuItem Text="Exit" Click="OnMenuItemExitClick" />
                    </utils:NotificationAreaIcon.MenuItems>
                </utils:NotificationAreaIcon>
     #region Notification Icon
    
            bool shouldClose;
            WindowState lastWindowState;
    
            protected override void OnStateChanged(EventArgs e)
            {
                this.lastWindowState = WindowState;
            }
    
            protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
            {
                if (!shouldClose)
                {
                    e.Cancel = true;
                    Hide();
                }
            }
    
            private void Open()
            {
                Show();
                WindowState = this.lastWindowState;
            }
    
    
            //双击还原
            private void OnNotificationAreaIconDoubleClick(object sender, MouseButtonEventArgs e)
            {
                if (e.ChangedButton == MouseButton.Left)
                {
                    Open();
                }
            }
    
            //re-login
    
            private void OnReLoginClick(object sender, EventArgs e)
            {
                this.Logout();
            }
    
            private void OnMenuItemExitClick(object sender, EventArgs e)
            {
                this.shouldClose = true;
                Close();
            }
    
            #endregion
  • 相关阅读:
    确定比赛名次
    What Are You Talking About
    小兔的棋盘
    How Many Answers Are Wrong
    备份当前的ubuntu系统生成iso
    eclipse导入maven项目有时出现web.xml is missing的问题
    eclipse自动添加版权信息
    javac不是内部或外部命令
    linux目录权限
    python import error:no module named yaml
  • 原文地址:https://www.cnblogs.com/quietwalk/p/3564598.html
Copyright © 2011-2022 走看看