From 97ef369a02825dd96e9b42e06338ed53aed8febe Mon Sep 17 00:00:00 2001 From: Philipp Sumi Date: Fri, 15 May 2009 09:51:55 +0000 Subject: [PATCH] WPF NotifyIcon -------------- FIX Removed debug output in WindowMessageSink. CHG Major rework on sample project. git-svn-id: https://svn.evolvesoftware.ch/repos/evolve.net/WPF/NotifyIcon@104 9f600761-6f11-4665-b6dc-0185e9171623 --- Source/Changelog.txt | 4 +- .../Diagrams/TaskbarIcon Overview.cd | 12 +- .../Interop/WindowMessageSink.cs | 17 +- Source/NotifyIconWpf/TaskbarIcon.cs | 1 + Source/Sample Project/App.xaml | 4 +- Source/Sample Project/App.xaml.cs | 2 + Source/Sample Project/Commands/CommandBase.cs | 15 +- .../Commands/HideMainWindowCommand.cs | 2 +- .../Commands/ShowMainWindowCommand.cs | 2 +- Source/Sample Project/Images/Preferences.png | Bin 0 -> 7825 bytes Source/Sample Project/Main.xaml | 191 +++++++++++++ Source/Sample Project/Main.xaml.cs | 105 +++++++ Source/Sample Project/Sample Project.csproj | 100 +++++-- .../{ => Showcase}/FancyBalloon.xaml | 4 +- .../{ => Showcase}/FancyBalloon.xaml.cs | 0 .../{ => Showcase}/FancyPopup.xaml | 2 +- .../{ => Showcase}/FancyPopup.xaml.cs | 0 .../{ => Showcase}/FancyToolTip.xaml | 2 +- .../{ => Showcase}/FancyToolTip.xaml.cs | 0 .../NotifyIconResources.xaml} | 0 .../ShowcaseWindow.xaml} | 54 ++-- .../ShowcaseWindow.xaml.cs} | 15 +- .../{ => Showcase}/WelcomeBalloon.xaml | 0 .../{ => Showcase}/WelcomeBalloon.xaml.cs | 0 .../NotifyIconResourceDictionary.xaml | 10 + ...1.xaml => SimpleWindowWithNotifyIcon.xaml} | 4 +- .../SimpleWindowWithNotifyIcon.xaml.cs | 23 ++ .../01 - Declaration/Window1.xaml.cs | 15 - .../02 - ToolTips/InlineToolTipWindow.xaml | 40 +++ .../02 - ToolTips/InlineToolTipWindow.xaml.cs | 34 +++ .../02 - ToolTips/SimpleUserControl.xaml | 28 +- .../02 - ToolTips/SimpleUserControl.xaml.cs | 2 +- .../UserControlToolTipWindow.xaml | 25 ++ .../UserControlToolTipWindow.xaml.cs | 34 +++ .../03 - Popups/InlinePopupWindow.xaml | 39 +++ .../03 - Popups/InlinePopupWindow.xaml.cs | 34 +++ .../InlineContextMenuWindow.xaml | 27 ++ .../InlineContextMenuWindow.xaml.cs | 35 +++ .../05 - Balloons/BalloonSampleWindow.xaml | 54 ++++ .../05 - Balloons/BalloonSampleWindow.xaml.cs | 67 +++++ .../06 - Commands/CommandWindow.xaml | 30 ++ .../06 - Commands/CommandWindow.xaml.cs | 34 +++ .../06 - Commands/ShowMessageCommand.cs | 25 ++ .../07 - Events/EventVisualizerWindow.xaml | 261 ++++++++++++++++++ .../07 - Events/EventVisualizerWindow.xaml.cs | 35 +++ .../DataBoundToolTipWindow.xaml | 89 ++++++ .../DataBoundToolTipWindow.xaml.cs | 35 +++ 47 files changed, 1405 insertions(+), 107 deletions(-) create mode 100644 Source/Sample Project/Images/Preferences.png create mode 100644 Source/Sample Project/Main.xaml create mode 100644 Source/Sample Project/Main.xaml.cs rename Source/Sample Project/{ => Showcase}/FancyBalloon.xaml (94%) rename Source/Sample Project/{ => Showcase}/FancyBalloon.xaml.cs (100%) rename Source/Sample Project/{ => Showcase}/FancyPopup.xaml (96%) rename Source/Sample Project/{ => Showcase}/FancyPopup.xaml.cs (100%) rename Source/Sample Project/{ => Showcase}/FancyToolTip.xaml (96%) rename Source/Sample Project/{ => Showcase}/FancyToolTip.xaml.cs (100%) rename Source/Sample Project/{TaskbarIconResources.xaml => Showcase/NotifyIconResources.xaml} (100%) rename Source/Sample Project/{Window1.xaml => Showcase/ShowcaseWindow.xaml} (90%) rename Source/Sample Project/{Window1.xaml.cs => Showcase/ShowcaseWindow.xaml.cs} (81%) rename Source/Sample Project/{ => Showcase}/WelcomeBalloon.xaml (100%) rename Source/Sample Project/{ => Showcase}/WelcomeBalloon.xaml.cs (100%) create mode 100644 Source/Sample Project/Tutorials/01 - Declaration/NotifyIconResourceDictionary.xaml rename Source/Sample Project/Tutorials/01 - Declaration/{Window1.xaml => SimpleWindowWithNotifyIcon.xaml} (62%) create mode 100644 Source/Sample Project/Tutorials/01 - Declaration/SimpleWindowWithNotifyIcon.xaml.cs delete mode 100644 Source/Sample Project/Tutorials/01 - Declaration/Window1.xaml.cs create mode 100644 Source/Sample Project/Tutorials/02 - ToolTips/InlineToolTipWindow.xaml create mode 100644 Source/Sample Project/Tutorials/02 - ToolTips/InlineToolTipWindow.xaml.cs create mode 100644 Source/Sample Project/Tutorials/02 - ToolTips/UserControlToolTipWindow.xaml create mode 100644 Source/Sample Project/Tutorials/02 - ToolTips/UserControlToolTipWindow.xaml.cs create mode 100644 Source/Sample Project/Tutorials/03 - Popups/InlinePopupWindow.xaml create mode 100644 Source/Sample Project/Tutorials/03 - Popups/InlinePopupWindow.xaml.cs create mode 100644 Source/Sample Project/Tutorials/04 - ContextMenus/InlineContextMenuWindow.xaml create mode 100644 Source/Sample Project/Tutorials/04 - ContextMenus/InlineContextMenuWindow.xaml.cs create mode 100644 Source/Sample Project/Tutorials/05 - Balloons/BalloonSampleWindow.xaml create mode 100644 Source/Sample Project/Tutorials/05 - Balloons/BalloonSampleWindow.xaml.cs create mode 100644 Source/Sample Project/Tutorials/06 - Commands/CommandWindow.xaml create mode 100644 Source/Sample Project/Tutorials/06 - Commands/CommandWindow.xaml.cs create mode 100644 Source/Sample Project/Tutorials/06 - Commands/ShowMessageCommand.cs create mode 100644 Source/Sample Project/Tutorials/07 - Events/EventVisualizerWindow.xaml create mode 100644 Source/Sample Project/Tutorials/07 - Events/EventVisualizerWindow.xaml.cs create mode 100644 Source/Sample Project/Tutorials/08 - DataBinding/DataBoundToolTipWindow.xaml create mode 100644 Source/Sample Project/Tutorials/08 - DataBinding/DataBoundToolTipWindow.xaml.cs diff --git a/Source/Changelog.txt b/Source/Changelog.txt index 27fab31..4d56c1a 100644 --- a/Source/Changelog.txt +++ b/Source/Changelog.txt @@ -10,7 +10,9 @@ Contact and Information: http://www.hardcodet.net CHG DataContext is also assigned to ContextMenu, and properly coerced for ToolTips and Popups. Also checks whether target item has a binding on the DataContext (does not just override if DataContext is null). - +CHG The LeftClickCommand now executes with a delay in order to mak sure + it's not a double-click. +FIX Removed debug output in WindowMessageSink. ---------------------------------------------------------------------------- diff --git a/Source/NotifyIconWpf/Diagrams/TaskbarIcon Overview.cd b/Source/NotifyIconWpf/Diagrams/TaskbarIcon Overview.cd index cd094d6..42e21f9 100644 --- a/Source/NotifyIconWpf/Diagrams/TaskbarIcon Overview.cd +++ b/Source/NotifyIconWpf/Diagrams/TaskbarIcon Overview.cd @@ -1,10 +1,9 @@  - + - @@ -14,11 +13,18 @@ - + ABAEAAAAAAAAAAABAAAAAAAAAAAAAAAAAIAKAIAAAAA= PopupActivationMode.cs + + + + AAAAAAAAAAAAAQAAAAAAABAAAAAAAAAAAAAAAEEAAAA= + BalloonIcon.cs + + \ No newline at end of file diff --git a/Source/NotifyIconWpf/Interop/WindowMessageSink.cs b/Source/NotifyIconWpf/Interop/WindowMessageSink.cs index 710fa06..1653525 100644 --- a/Source/NotifyIconWpf/Interop/WindowMessageSink.cs +++ b/Source/NotifyIconWpf/Interop/WindowMessageSink.cs @@ -233,17 +233,14 @@ namespace Hardcodet.Wpf.TaskbarNotification.Interop switch (lParam) { case 0x200: -// Debug.WriteLine("MOVE"); MouseEventReceived(MouseEvent.MouseMove); break; case 0x201: - Debug.WriteLine("left down 1"); MouseEventReceived(MouseEvent.IconLeftMouseDown); break; case 0x202: - Debug.WriteLine("left up"); if (!isDoubleClick) { MouseEventReceived(MouseEvent.IconLeftMouseUp); @@ -252,69 +249,57 @@ namespace Hardcodet.Wpf.TaskbarNotification.Interop break; case 0x203: - Debug.WriteLine("left click 2"); isDoubleClick = true; MouseEventReceived(MouseEvent.IconDoubleClick); break; case 0x204: - Debug.WriteLine("right click 1"); MouseEventReceived(MouseEvent.IconRightMouseDown); break; case 0x205: - Console.Out.WriteLine("right mouse up"); MouseEventReceived(MouseEvent.IconRightMouseUp); break; case 0x206: //double click with right mouse button - do not trigger event - Debug.WriteLine("right click 2"); break; case 0x207: - Debug.WriteLine("middle click 1"); MouseEventReceived(MouseEvent.IconMiddleMouseDown); break; case 520: - Debug.WriteLine("mouse up middle"); MouseEventReceived(MouseEvent.IconMiddleMouseUp); break; case 0x209: //double click with middle mouse button - do not trigger event - Debug.WriteLine("middle click 2"); break; case 0x402: - Debug.WriteLine("balloon shown"); BallonToolTipChanged(true); break; case 0x403: case 0x404: - Debug.WriteLine("balloon close"); BallonToolTipChanged(false); break; case 0x405: - Debug.WriteLine("balloon clicked"); MouseEventReceived(MouseEvent.BalloonToolTipClicked); break; case 0x406: - Debug.WriteLine("show custom tooltip"); ChangeToolTipStateRequest(true); break; case 0x407: - Debug.WriteLine("close custom tooltip"); ChangeToolTipStateRequest(false); break; default: - Debug.WriteLine("Unhandled message ID: " + lParam); + Debug.WriteLine("Unhandled NotifyIcon message ID: " + lParam); break; } diff --git a/Source/NotifyIconWpf/TaskbarIcon.cs b/Source/NotifyIconWpf/TaskbarIcon.cs index 320aa42..2a4ff06 100644 --- a/Source/NotifyIconWpf/TaskbarIcon.cs +++ b/Source/NotifyIconWpf/TaskbarIcon.cs @@ -156,6 +156,7 @@ namespace Hardcodet.Wpf.TaskbarNotification /// /// An optional animation for the popup. /// The time after which the popup is being closed. + /// Submit null in order to keep the balloon open inde /// /// If /// is a null reference. diff --git a/Source/Sample Project/App.xaml b/Source/Sample Project/App.xaml index e3eec8e..e4e63cf 100644 --- a/Source/Sample Project/App.xaml +++ b/Source/Sample Project/App.xaml @@ -1,12 +1,12 @@  + StartupUri="Main.xaml"> - + diff --git a/Source/Sample Project/App.xaml.cs b/Source/Sample Project/App.xaml.cs index 3ddc729..0764b0a 100644 --- a/Source/Sample Project/App.xaml.cs +++ b/Source/Sample Project/App.xaml.cs @@ -4,6 +4,7 @@ using System.Configuration; using System.Data; using System.Linq; using System.Windows; +using Hardcodet.Wpf.TaskbarNotification; namespace Samples { @@ -12,5 +13,6 @@ namespace Samples /// public partial class App : Application { + } } diff --git a/Source/Sample Project/Commands/CommandBase.cs b/Source/Sample Project/Commands/CommandBase.cs index c841986..9b47695 100644 --- a/Source/Sample Project/Commands/CommandBase.cs +++ b/Source/Sample Project/Commands/CommandBase.cs @@ -1,4 +1,6 @@ using System; +using System.ComponentModel; +using System.Windows; using System.Windows.Input; using System.Windows.Markup; @@ -58,7 +60,18 @@ namespace Samples.Commands /// public virtual bool CanExecute(object parameter) { - return true; + return IsDesignMode ? false : true; + } + + + public static bool IsDesignMode + { + get + { + return (bool) + DependencyPropertyDescriptor.FromProperty(DesignerProperties.IsInDesignModeProperty, typeof(FrameworkElement)) + .Metadata.DefaultValue; + } } } } diff --git a/Source/Sample Project/Commands/HideMainWindowCommand.cs b/Source/Sample Project/Commands/HideMainWindowCommand.cs index eae7c0e..694fb1f 100644 --- a/Source/Sample Project/Commands/HideMainWindowCommand.cs +++ b/Source/Sample Project/Commands/HideMainWindowCommand.cs @@ -18,7 +18,7 @@ namespace Samples.Commands public override bool CanExecute(object parameter) { - return Application.Current.MainWindow.IsVisible; + return !IsDesignMode && Application.Current.MainWindow.IsVisible; } diff --git a/Source/Sample Project/Commands/ShowMainWindowCommand.cs b/Source/Sample Project/Commands/ShowMainWindowCommand.cs index c499c85..f3bccc9 100644 --- a/Source/Sample Project/Commands/ShowMainWindowCommand.cs +++ b/Source/Sample Project/Commands/ShowMainWindowCommand.cs @@ -20,7 +20,7 @@ namespace Samples.Commands public override bool CanExecute(object parameter) { - return Application.Current.MainWindow.IsVisible == false; + return !IsDesignMode && Application.Current.MainWindow.IsVisible == false; } } diff --git a/Source/Sample Project/Images/Preferences.png b/Source/Sample Project/Images/Preferences.png new file mode 100644 index 0000000000000000000000000000000000000000..cd420d73e900e3e34e41fe4af245ef70dfcd38b5 GIT binary patch literal 7825 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 e_Z%*j3ugJkm?&CG8KkMMtA + + + + + + + + + +