CHG Moved files to new root folder.
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>Hardcodet.NotifyIcon.Wpf</id>
|
||||
<version>1.0.5</version>
|
||||
<title>Hardcodet WPF NotifyIcon</title>
|
||||
<authors>Philipp Sumi</authors>
|
||||
<owners>Philipp Sumi</owners>
|
||||
<licenseUrl>http://www.codeproject.com/info/cpol10.aspx</licenseUrl>
|
||||
<projectUrl>http://www.hardcodet.net/projects/wpf-notifyicon</projectUrl>
|
||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||
<description>This is an implementation of a NotifyIcon (aka system tray icon or taskbar icon) for the WPF platform. It does not just rely on the Windows Forms NotifyIcon component, but is a purely independent control which leverages several features of the WPF framework in order to display rich tooltips, popups, context menus, and balloon messages. It can be used directly in code or embedded in any XAML file.
|
||||
|
||||
Source code and extensive sample application available at http://www.hardcodet.net/projects/wpf-notifyicon</description>
|
||||
<summary>NotifyIcon (aka system tray icon or taskbar icon) for the WPF platform.</summary>
|
||||
<releaseNotes>Mostly bug fixes and full x64 / Win 8 support. Contains source and binaries for .NET 3.5 - 4.51.</releaseNotes>
|
||||
<copyright>Copyright (c) 2013 Philipp Sumi</copyright>
|
||||
<language />
|
||||
<tags>NotifyIcon WPF Tray Notify ToolTip Popup Balloon Toast</tags>
|
||||
</metadata>
|
||||
<files>
|
||||
<file src="..\Binaries\net35\Hardcodet.Wpf.TaskbarNotification.dll" target="lib\net35\Hardcodet.Wpf.TaskbarNotification.dll" />
|
||||
<file src="..\Binaries\net35\Hardcodet.Wpf.TaskbarNotification.pdb" target="lib\net35\Hardcodet.Wpf.TaskbarNotification.pdb" />
|
||||
<file src="..\Binaries\net35\Hardcodet.Wpf.TaskbarNotification.xml" target="lib\net35\Hardcodet.Wpf.TaskbarNotification.xml" />
|
||||
<file src="..\Binaries\net35-client\Hardcodet.Wpf.TaskbarNotification.dll" target="lib\net35-client\Hardcodet.Wpf.TaskbarNotification.dll" />
|
||||
<file src="..\Binaries\net35-client\Hardcodet.Wpf.TaskbarNotification.pdb" target="lib\net35-client\Hardcodet.Wpf.TaskbarNotification.pdb" />
|
||||
<file src="..\Binaries\net35-client\Hardcodet.Wpf.TaskbarNotification.xml" target="lib\net35-client\Hardcodet.Wpf.TaskbarNotification.xml" />
|
||||
<file src="..\Binaries\net40\Hardcodet.Wpf.TaskbarNotification.dll" target="lib\net40\Hardcodet.Wpf.TaskbarNotification.dll" />
|
||||
<file src="..\Binaries\net40\Hardcodet.Wpf.TaskbarNotification.pdb" target="lib\net40\Hardcodet.Wpf.TaskbarNotification.pdb" />
|
||||
<file src="..\Binaries\net40\Hardcodet.Wpf.TaskbarNotification.xml" target="lib\net40\Hardcodet.Wpf.TaskbarNotification.xml" />
|
||||
<file src="..\Binaries\net40-client\Hardcodet.Wpf.TaskbarNotification.dll" target="lib\net40-client\Hardcodet.Wpf.TaskbarNotification.dll" />
|
||||
<file src="..\Binaries\net40-client\Hardcodet.Wpf.TaskbarNotification.pdb" target="lib\net40-client\Hardcodet.Wpf.TaskbarNotification.pdb" />
|
||||
<file src="..\Binaries\net40-client\Hardcodet.Wpf.TaskbarNotification.xml" target="lib\net40-client\Hardcodet.Wpf.TaskbarNotification.xml" />
|
||||
<file src="..\Binaries\net45\Hardcodet.Wpf.TaskbarNotification.dll" target="lib\net45\Hardcodet.Wpf.TaskbarNotification.dll" />
|
||||
<file src="..\Binaries\net45\Hardcodet.Wpf.TaskbarNotification.pdb" target="lib\net45\Hardcodet.Wpf.TaskbarNotification.pdb" />
|
||||
<file src="..\Binaries\net45\Hardcodet.Wpf.TaskbarNotification.xml" target="lib\net45\Hardcodet.Wpf.TaskbarNotification.xml" />
|
||||
<file src="..\Binaries\net451\Hardcodet.Wpf.TaskbarNotification.dll" target="lib\net451\Hardcodet.Wpf.TaskbarNotification.dll" />
|
||||
<file src="..\Binaries\net451\Hardcodet.Wpf.TaskbarNotification.pdb" target="lib\net451\Hardcodet.Wpf.TaskbarNotification.pdb" />
|
||||
<file src="..\Binaries\net451\Hardcodet.Wpf.TaskbarNotification.xml" target="lib\net451\Hardcodet.Wpf.TaskbarNotification.xml" />
|
||||
<file src="readme.1.0.5.txt" target="readme.txt" />
|
||||
</files>
|
||||
</package>
|
||||
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>Hardcodet.Wpf.TaskbarNotification</id>
|
||||
<version>1.0.5</version>
|
||||
<title>Hardcodet.Wpf.TaskbarNotification</title>
|
||||
<authors>Philipp Sumi</authors>
|
||||
<owners>Philipp Sumi</owners>
|
||||
<licenseUrl>http://www.codeproject.com/info/cpol10.aspx</licenseUrl>
|
||||
<projectUrl>http://www.hardcodet.net/projects/wpf-notifyicon</projectUrl>
|
||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||
<description>THIS PACKAGE IS OBSOLETE.
|
||||
|
||||
Please switch to the officially maintained NuGet package: Hardcodet.NotifyIcon.WPF
|
||||
|
||||
This is an implementation of a NotifyIcon (aka system tray icon or taskbar icon) for the WPF platform. It does not just rely on the Windows Forms NotifyIcon component, but is a purely independent control which leverages several features of the WPF framework in order to display rich tooltips, popups, context menus, and balloon messages. It can be used directly in code or embedded in any XAML file.
|
||||
|
||||
Source code and extensive sample application available at http://www.hardcodet.net/projects/wpf-notifyicon</description>
|
||||
<summary>This package is obsolete. Please switch to the maintained NuGet package: Hardcodet.NotifyIcon.WPF</summary>
|
||||
<releaseNotes>Mostly bug fixes and full x64 / Win 8 support. Contains source and binaries for .NET 3.5 - 4.51.</releaseNotes>
|
||||
<copyright>Copyright (c) 2013 Philipp Sumi</copyright>
|
||||
<language />
|
||||
<tags>NotifyIcon WPF Tray Notify ToolTip Popup Balloon Toast</tags>
|
||||
<dependencies>
|
||||
<dependency id="Hardcodet.NotifyIcon.Wpf" version="1.0.5" />
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
<file src="readme.from.legacy.package.txt" target="readme.txt" />
|
||||
</files>
|
||||
</package>
|
||||
@@ -0,0 +1,9 @@
|
||||
Hardcodet NotifyIcon for WPF
|
||||
****************************
|
||||
|
||||
THIS PACKAGE IS OBSOLETE.
|
||||
|
||||
This package has a dependency to the official package in order to keep things working for you, but consider switching to the official NuGet package: Hardcodet.NotifyIcon.Wpf
|
||||
|
||||
For direct NuGet links, source code or samples, please visit the project page:
|
||||
http://www.hardcodet.net/projects/wpf-notifyicon
|
||||
10
Hardcodet.NotifyIcon.Wpf/NuGet/readme.1.0.5.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
Hardcodet NotifyIcon for WPF 1.0.5
|
||||
**********************************
|
||||
|
||||
This is an implementation of a NotifyIcon (aka system tray icon or taskbar icon) for the WPF platform. It does not just rely on the Windows Forms NotifyIcon component, but is a purely independent control which leverages several features of the WPF framework in order to display rich tooltips, popups, context menus, and balloon messages. It can be used directly in code or embedded in any XAML file.
|
||||
|
||||
This package contains only binaries. For source code and samples, please visit the project page:
|
||||
http://www.hardcodet.net/projects/wpf-notifyicon
|
||||
|
||||
|
||||
|
||||
9
Hardcodet.NotifyIcon.Wpf/Source/BuildTargets.cmd
Normal file
@@ -0,0 +1,9 @@
|
||||
"C:\Program Files (x86)\MSBuild\12.0\Bin\msbuild.exe" NotifyIconWpf\NotifyIconWpf.csproj /p:Configuration=Release;TargetFrameworkVersion=v3.5;TargetFrameworkProfile="";OutputPath=..\..\Binaries\net35 /t:Rebuild
|
||||
"C:\Program Files (x86)\MSBuild\12.0\Bin\msbuild.exe" NotifyIconWpf\NotifyIconWpf.csproj /p:Configuration=Release;TargetFrameworkVersion=v3.5;TargetFrameworkProfile="Client";OutputPath=..\..\Binaries\net35-client /t:Rebuild
|
||||
|
||||
"C:\Program Files (x86)\MSBuild\12.0\Bin\msbuild.exe" NotifyIconWpf\NotifyIconWpf.csproj /p:Configuration=Release;TargetFrameworkVersion=v4.0;TargetFrameworkProfile="";OutputPath=..\..\Binaries\net40 /t:Rebuild
|
||||
"C:\Program Files (x86)\MSBuild\12.0\Bin\msbuild.exe" NotifyIconWpf\NotifyIconWpf.csproj /p:Configuration=Release;TargetFrameworkVersion=v4.0;TargetFrameworkProfile="Client";OutputPath=..\..\Binaries\net40-client /t:Rebuild
|
||||
|
||||
"C:\Program Files (x86)\MSBuild\12.0\Bin\msbuild.exe" NotifyIconWpf\NotifyIconWpf.csproj /p:Configuration=Release;TargetFrameworkVersion=v4.5;TargetFrameworkProfile="";OutputPath=..\..\Binaries\net45 /t:Rebuild
|
||||
|
||||
"C:\Program Files (x86)\MSBuild\12.0\Bin\msbuild.exe" NotifyIconWpf\NotifyIconWpf.csproj /p:Configuration=Release;TargetFrameworkVersion=v4.5.1;TargetFrameworkProfile="";OutputPath=..\..\Binaries\net451 /t:Rebuild
|
||||
77
Hardcodet.NotifyIcon.Wpf/Source/Changelog.txt
Normal file
@@ -0,0 +1,77 @@
|
||||
hardcodet.net NotifyIcon for WPF - Changelog
|
||||
Copyright (c) 2009-2013 Philipp Sumi
|
||||
Contact and Information: http://www.hardcodet.net
|
||||
|
||||
|
||||
1.0.5 (2013.11.20)
|
||||
*****
|
||||
|
||||
FIX Support for x64 applications targeting .NET 4 x64 or higher (big thanks to Mark Junker for submitting a patch!)
|
||||
CHG Component does no longer throw an exception is no Explorer shell is present,
|
||||
but waits for it to be created.
|
||||
CHG NotifyIcon is not only removed on user-initiated disposal, but also garbage collection.
|
||||
CHG The attached ParentTaskbarIconProperty is now derived, so data binding to the attached DP
|
||||
becomes much simpler
|
||||
(e.g. <TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Path=(tb:TaskbarIcon.ParentTaskbarIcon).ToolTipText}" />)
|
||||
CHG WinAPI interop now uses Unicode in order to prevent issues with Asian languages. Thanks to JO Hyeong-Ryeol for posting an easy fix!
|
||||
FIX Context menues receiving keyboard events, which allows for TextBoxes in context menus.
|
||||
FIX Coordinates calculated properly on operating systems with non-standard DPIs. Thanks Rusi Filipov for bug reporting and testing.
|
||||
FIX Data-bound ToolTipText may have caused ToolTips to remain open in case of property changes.
|
||||
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
1.0.4 (2009.09.21)
|
||||
*****
|
||||
|
||||
FIX If a popup is opened, its window handle is now being set as the foreground.
|
||||
This fixes an issue with certain controls being disabled on popups.
|
||||
(thanks Andrew Smith for pointing me in the right direction!).
|
||||
FIX Changed dispatcher access in order to work in WinForms scenarios, too.
|
||||
FIX Corrected typo in WindowMessageSink.BalloonToolTipChanged event (thanks Mertsch).
|
||||
Used internally (although event is public), so this shouldn't be a breaking change.
|
||||
FIX Dispose only deregisters OnExit event listenter if there is actually an
|
||||
application (not the case in WinForms environments).
|
||||
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
1.0.3 (2009.07.02)
|
||||
*****
|
||||
FIX Commands did not work with RoutedCommands which require an explicit target
|
||||
(thanks Rodolfo Grave).
|
||||
ADD Added command target properties for both left and double click commands.
|
||||
Allows to explicitly define another control as the target of a routed
|
||||
command.
|
||||
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
1.0.2 (2009.05.18)
|
||||
*****
|
||||
FIX Late-bound DataContext did not coerce properly with ContextMenu, thus
|
||||
assigning it the TaskbarIcon rather than the TaskbarIcon's DataContext.
|
||||
Thanks Nic Pillinger for discovering the issue.
|
||||
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
1.0.1 (2009.05.15)
|
||||
*****
|
||||
CHG DataContext is also assigned to ContextMenu (thanks Nic Pillinger),
|
||||
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 Popup creation no longer calls Popup.CreateRootPopup which tries to
|
||||
bind to dependency properties that do not exist, thus causing debug
|
||||
warnings (thanks to Loic Berthollet).
|
||||
CHG The LeftClickCommand now executes with a delay in order to make sure
|
||||
it's not a double-click.
|
||||
FIX Removed debug output in WindowMessageSink.
|
||||
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
1.0.0
|
||||
*****
|
||||
ADD Initial release.
|
||||
@@ -0,0 +1,20 @@
|
||||
del /s /ah /f *.suo
|
||||
del /s /f *.user
|
||||
del /s /f *.cache
|
||||
del /s /f *.scc
|
||||
del /s /f *.vssscc
|
||||
del /s /f *.vspscc
|
||||
del /s /f *.keep
|
||||
del /s /ah /f vssver2.scc
|
||||
|
||||
rd /s /q bin obj ClientBin _Resharper.* _Upgrade*
|
||||
|
||||
del dirs.txt
|
||||
dir /s /b /ad bin > dirs.txt
|
||||
dir /s /b /ad obj >> dirs.txt
|
||||
dir /s /b /ad ClientBin >> dirs.txt
|
||||
dir /s /b /ad _Resharper.* >> dirs.txt
|
||||
dir /s /b /ad _Upgrade* >> dirs.txt
|
||||
|
||||
for /f "delims=;" %%i in (dirs.txt) DO rd /s /q "%%i"
|
||||
del dirs.txt
|
||||
45
Hardcodet.NotifyIcon.Wpf/Source/NotifyIconWpf.sln
Normal file
@@ -0,0 +1,45 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2013
|
||||
VisualStudioVersion = 12.0.21005.1
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C37AE34D-A8C4-4AEC-995C-3C763300934E}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
Changelog.txt = Changelog.txt
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotifyIconWpf", "NotifyIconWpf\NotifyIconWpf.csproj", "{7AC63864-7638-41C4-969C-D3197EF2BED9}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample Project", "Sample Project\Sample Project.csproj", "{71C74F29-F1C2-49C5-969F-C25AC4CDFCCC}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsFormsSample", "WindowsFormsSample\WindowsFormsSample.csproj", "{F6DC0A6D-D1CE-4AD2-92ED-08FFF0AD4FA8}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Windowless Sample", "Windowless Sample\Windowless Sample.csproj", "{964EBFBE-A600-49B2-BDD8-422B46F1D544}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{7AC63864-7638-41C4-969C-D3197EF2BED9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{7AC63864-7638-41C4-969C-D3197EF2BED9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{7AC63864-7638-41C4-969C-D3197EF2BED9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{7AC63864-7638-41C4-969C-D3197EF2BED9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{71C74F29-F1C2-49C5-969F-C25AC4CDFCCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{71C74F29-F1C2-49C5-969F-C25AC4CDFCCC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{71C74F29-F1C2-49C5-969F-C25AC4CDFCCC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{71C74F29-F1C2-49C5-969F-C25AC4CDFCCC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{F6DC0A6D-D1CE-4AD2-92ED-08FFF0AD4FA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F6DC0A6D-D1CE-4AD2-92ED-08FFF0AD4FA8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F6DC0A6D-D1CE-4AD2-92ED-08FFF0AD4FA8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{F6DC0A6D-D1CE-4AD2-92ED-08FFF0AD4FA8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{964EBFBE-A600-49B2-BDD8-422B46F1D544}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{964EBFBE-A600-49B2-BDD8-422B46F1D544}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{964EBFBE-A600-49B2-BDD8-422B46F1D544}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{964EBFBE-A600-49B2-BDD8-422B46F1D544}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
52
Hardcodet.NotifyIcon.Wpf/Source/NotifyIconWpf/BalloonIcon.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
// hardcodet.net NotifyIcon for WPF
|
||||
// Copyright (c) 2009 - 2013 Philipp Sumi
|
||||
// Contact and Information: http://www.hardcodet.net
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the Code Project Open License (CPOL);
|
||||
// either version 1.0 of the License, or (at your option) any later
|
||||
// version.
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
// OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THIS COPYRIGHT NOTICE MAY NOT BE REMOVED FROM THIS FILE
|
||||
|
||||
|
||||
namespace Hardcodet.Wpf.TaskbarNotification
|
||||
{
|
||||
///<summary>
|
||||
/// Supported icons for the tray's balloon messages.
|
||||
///</summary>
|
||||
public enum BalloonIcon
|
||||
{
|
||||
/// <summary>
|
||||
/// The balloon message is displayed without an icon.
|
||||
/// </summary>
|
||||
None,
|
||||
|
||||
/// <summary>
|
||||
/// An information is displayed.
|
||||
/// </summary>
|
||||
Info,
|
||||
|
||||
/// <summary>
|
||||
/// A warning is displayed.
|
||||
/// </summary>
|
||||
Warning,
|
||||
|
||||
/// <summary>
|
||||
/// An error is displayed.
|
||||
/// </summary>
|
||||
Error
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ClassDiagram MajorVersion="1" MinorVersion="1">
|
||||
<Class Name="Hardcodet.Wpf.TaskbarNotification.TaskbarIcon">
|
||||
<Position X="1.75" Y="0.5" Width="3.5" />
|
||||
<Compartments>
|
||||
<Compartment Name="Fields" Collapsed="true" />
|
||||
<Compartment Name="Methods" Collapsed="true" />
|
||||
</Compartments>
|
||||
<TypeIdentifier>
|
||||
<HashCode>N6qdVIeUdLmQtSUbiJhEGdYRjvJYXlhbEVBDKuPRO5s=</HashCode>
|
||||
<FileName>TaskbarIcon.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
<Lollipop Position="0.2" />
|
||||
</Class>
|
||||
<Enum Name="Hardcodet.Wpf.TaskbarNotification.PopupActivationMode">
|
||||
<Position X="6.75" Y="0.5" Width="2" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>ABAEAAAAAAAAAAABAAAAAAAAAAAAAAAAAIAKAIAAAAA=</HashCode>
|
||||
<FileName>PopupActivationMode.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Enum>
|
||||
<Enum Name="Hardcodet.Wpf.TaskbarNotification.BalloonIcon">
|
||||
<Position X="9.25" Y="0.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAQAAAAAAABAAAAAAAAAAAAAAAEEAAAA=</HashCode>
|
||||
<FileName>BalloonIcon.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Enum>
|
||||
<Font Name="Segoe UI" Size="9" />
|
||||
</ClassDiagram>
|
||||
@@ -0,0 +1,61 @@
|
||||
namespace Hardcodet.Wpf.TaskbarNotification.Interop
|
||||
{
|
||||
/// <summary>
|
||||
/// Flags that define the icon that is shown on a balloon
|
||||
/// tooltip.
|
||||
/// </summary>
|
||||
public enum BalloonFlags
|
||||
{
|
||||
/// <summary>
|
||||
/// No icon is displayed.
|
||||
/// </summary>
|
||||
None = 0x00,
|
||||
|
||||
/// <summary>
|
||||
/// An information icon is displayed.
|
||||
/// </summary>
|
||||
Info = 0x01,
|
||||
|
||||
/// <summary>
|
||||
/// A warning icon is displayed.
|
||||
/// </summary>
|
||||
Warning = 0x02,
|
||||
|
||||
/// <summary>
|
||||
/// An error icon is displayed.
|
||||
/// </summary>
|
||||
Error = 0x03,
|
||||
|
||||
/// <summary>
|
||||
/// Windows XP Service Pack 2 (SP2) and later.
|
||||
/// Use a custom icon as the title icon.
|
||||
/// </summary>
|
||||
User = 0x04,
|
||||
|
||||
/// <summary>
|
||||
/// Windows XP (Shell32.dll version 6.0) and later.
|
||||
/// Do not play the associated sound. Applies only to balloon ToolTips.
|
||||
/// </summary>
|
||||
NoSound = 0x10,
|
||||
|
||||
/// <summary>
|
||||
/// Windows Vista (Shell32.dll version 6.0.6) and later. The large version
|
||||
/// of the icon should be used as the balloon icon. This corresponds to the
|
||||
/// icon with dimensions SM_CXICON x SM_CYICON. If this flag is not set,
|
||||
/// the icon with dimensions XM_CXSMICON x SM_CYSMICON is used.<br/>
|
||||
/// - This flag can be used with all stock icons.<br/>
|
||||
/// - Applications that use older customized icons (NIIF_USER with hIcon) must
|
||||
/// provide a new SM_CXICON x SM_CYICON version in the tray icon (hIcon). These
|
||||
/// icons are scaled down when they are displayed in the System Tray or
|
||||
/// System Control Area (SCA).<br/>
|
||||
/// - New customized icons (NIIF_USER with hBalloonIcon) must supply an
|
||||
/// SM_CXICON x SM_CYICON version in the supplied icon (hBalloonIcon).
|
||||
/// </summary>
|
||||
LargeIcon = 0x20,
|
||||
|
||||
/// <summary>
|
||||
/// Windows 7 and later.
|
||||
/// </summary>
|
||||
RespectQuietTime = 0x80
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
using System;
|
||||
|
||||
namespace Hardcodet.Wpf.TaskbarNotification.Interop
|
||||
{
|
||||
/// <summary>
|
||||
/// Indicates which members of a <see cref="NotifyIconData"/> structure
|
||||
/// were set, and thus contain valid data or provide additional information
|
||||
/// to the ToolTip as to how it should display.
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum IconDataMembers
|
||||
{
|
||||
/// <summary>
|
||||
/// The message ID is set.
|
||||
/// </summary>
|
||||
Message = 0x01,
|
||||
|
||||
/// <summary>
|
||||
/// The notification icon is set.
|
||||
/// </summary>
|
||||
Icon = 0x02,
|
||||
|
||||
/// <summary>
|
||||
/// The tooltip is set.
|
||||
/// </summary>
|
||||
Tip = 0x04,
|
||||
|
||||
/// <summary>
|
||||
/// State information (<see cref="IconState"/>) is set. This
|
||||
/// applies to both <see cref="NotifyIconData.IconState"/> and
|
||||
/// <see cref="NotifyIconData.StateMask"/>.
|
||||
/// </summary>
|
||||
State = 0x08,
|
||||
|
||||
/// <summary>
|
||||
/// The balloon ToolTip is set. Accordingly, the following
|
||||
/// members are set: <see cref="NotifyIconData.BalloonText"/>,
|
||||
/// <see cref="NotifyIconData.BalloonTitle"/>, <see cref="NotifyIconData.BalloonFlags"/>,
|
||||
/// and <see cref="NotifyIconData.VersionOrTimeout"/>.
|
||||
/// </summary>
|
||||
Info = 0x10,
|
||||
|
||||
// Internal identifier is set. Reserved, thus commented out.
|
||||
//Guid = 0x20,
|
||||
|
||||
/// <summary>
|
||||
/// Windows Vista (Shell32.dll version 6.0.6) and later. If the ToolTip
|
||||
/// cannot be displayed immediately, discard it.<br/>
|
||||
/// Use this flag for ToolTips that represent real-time information which
|
||||
/// would be meaningless or misleading if displayed at a later time.
|
||||
/// For example, a message that states "Your telephone is ringing."<br/>
|
||||
/// This modifies and must be combined with the <see cref="Info"/> flag.
|
||||
/// </summary>
|
||||
Realtime = 0x40,
|
||||
|
||||
/// <summary>
|
||||
/// Windows Vista (Shell32.dll version 6.0.6) and later.
|
||||
/// Use the standard ToolTip. Normally, when uVersion is set
|
||||
/// to NOTIFYICON_VERSION_4, the standard ToolTip is replaced
|
||||
/// by the application-drawn pop-up user interface (UI).
|
||||
/// If the application wants to show the standard tooltip
|
||||
/// in that case, regardless of whether the on-hover UI is showing,
|
||||
/// it can specify NIF_SHOWTIP to indicate the standard tooltip
|
||||
/// should still be shown.<br/>
|
||||
/// Note that the NIF_SHOWTIP flag is effective until the next call
|
||||
/// to Shell_NotifyIcon.
|
||||
/// </summary>
|
||||
UseLegacyToolTips = 0x80
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
namespace Hardcodet.Wpf.TaskbarNotification.Interop
|
||||
{
|
||||
/// <summary>
|
||||
/// The state of the icon - can be set to
|
||||
/// hide the icon.
|
||||
/// </summary>
|
||||
public enum IconState
|
||||
{
|
||||
/// <summary>
|
||||
/// The icon is visible.
|
||||
/// </summary>
|
||||
Visible = 0x00,
|
||||
|
||||
/// <summary>
|
||||
/// Hide the icon.
|
||||
/// </summary>
|
||||
Hidden = 0x01,
|
||||
|
||||
// The icon is shared - currently not supported, thus commented out.
|
||||
//Shared = 0x02
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
namespace Hardcodet.Wpf.TaskbarNotification.Interop
|
||||
{
|
||||
/// <summary>
|
||||
/// Event flags for clicked events.
|
||||
/// </summary>
|
||||
public enum MouseEvent
|
||||
{
|
||||
/// <summary>
|
||||
/// The mouse was moved withing the
|
||||
/// taskbar icon's area.
|
||||
/// </summary>
|
||||
MouseMove,
|
||||
|
||||
/// <summary>
|
||||
/// The right mouse button was clicked.
|
||||
/// </summary>
|
||||
IconRightMouseDown,
|
||||
|
||||
/// <summary>
|
||||
/// The left mouse button was clicked.
|
||||
/// </summary>
|
||||
IconLeftMouseDown,
|
||||
|
||||
/// <summary>
|
||||
/// The right mouse button was released.
|
||||
/// </summary>
|
||||
IconRightMouseUp,
|
||||
|
||||
/// <summary>
|
||||
/// The left mouse button was released.
|
||||
/// </summary>
|
||||
IconLeftMouseUp,
|
||||
|
||||
/// <summary>
|
||||
/// The middle mouse button was clicked.
|
||||
/// </summary>
|
||||
IconMiddleMouseDown,
|
||||
|
||||
/// <summary>
|
||||
/// The middle mouse button was released.
|
||||
/// </summary>
|
||||
IconMiddleMouseUp,
|
||||
|
||||
/// <summary>
|
||||
/// The taskbar icon was double clicked.
|
||||
/// </summary>
|
||||
IconDoubleClick,
|
||||
|
||||
/// <summary>
|
||||
/// The balloon tip was clicked.
|
||||
/// </summary>
|
||||
BalloonToolTipClicked
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
namespace Hardcodet.Wpf.TaskbarNotification.Interop
|
||||
{
|
||||
/// <summary>
|
||||
/// Main operations performed on the
|
||||
/// <see cref="WinApi.Shell_NotifyIcon"/> function.
|
||||
/// </summary>
|
||||
public enum NotifyCommand
|
||||
{
|
||||
/// <summary>
|
||||
/// The taskbar icon is being created.
|
||||
/// </summary>
|
||||
Add = 0x00,
|
||||
|
||||
/// <summary>
|
||||
/// The settings of the taskbar icon are being updated.
|
||||
/// </summary>
|
||||
Modify = 0x01,
|
||||
|
||||
/// <summary>
|
||||
/// The taskbar icon is deleted.
|
||||
/// </summary>
|
||||
Delete = 0x02,
|
||||
|
||||
/// <summary>
|
||||
/// Focus is returned to the taskbar icon. Currently not in use.
|
||||
/// </summary>
|
||||
SetFocus = 0x03,
|
||||
|
||||
/// <summary>
|
||||
/// Shell32.dll version 5.0 and later only. Instructs the taskbar
|
||||
/// to behave according to the version number specified in the
|
||||
/// uVersion member of the structure pointed to by lpdata.
|
||||
/// This message allows you to specify whether you want the version
|
||||
/// 5.0 behavior found on Microsoft Windows 2000 systems, or the
|
||||
/// behavior found on earlier Shell versions. The default value for
|
||||
/// uVersion is zero, indicating that the original Windows 95 notify
|
||||
/// icon behavior should be used.
|
||||
/// </summary>
|
||||
SetVersion = 0x04
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,165 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Hardcodet.Wpf.TaskbarNotification.Interop
|
||||
{
|
||||
/// <summary>
|
||||
/// A struct that is submitted in order to configure
|
||||
/// the taskbar icon. Provides various members that
|
||||
/// can be configured partially, according to the
|
||||
/// values of the <see cref="IconDataMembers"/>
|
||||
/// that were defined.
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
||||
public struct NotifyIconData
|
||||
{
|
||||
/// <summary>
|
||||
/// Size of this structure, in bytes.
|
||||
/// </summary>
|
||||
public uint cbSize;
|
||||
|
||||
/// <summary>
|
||||
/// Handle to the window that receives notification messages associated with an icon in the
|
||||
/// taskbar status area. The Shell uses hWnd and uID to identify which icon to operate on
|
||||
/// when Shell_NotifyIcon is invoked.
|
||||
/// </summary>
|
||||
public IntPtr WindowHandle;
|
||||
|
||||
/// <summary>
|
||||
/// Application-defined identifier of the taskbar icon. The Shell uses hWnd and uID to identify
|
||||
/// which icon to operate on when Shell_NotifyIcon is invoked. You can have multiple icons
|
||||
/// associated with a single hWnd by assigning each a different uID. This feature, however
|
||||
/// is currently not used.
|
||||
/// </summary>
|
||||
public uint TaskbarIconId;
|
||||
|
||||
/// <summary>
|
||||
/// Flags that indicate which of the other members contain valid data. This member can be
|
||||
/// a combination of the NIF_XXX constants.
|
||||
/// </summary>
|
||||
public IconDataMembers ValidMembers;
|
||||
|
||||
/// <summary>
|
||||
/// Application-defined message identifier. The system uses this identifier to send
|
||||
/// notifications to the window identified in hWnd.
|
||||
/// </summary>
|
||||
public uint CallbackMessageId;
|
||||
|
||||
/// <summary>
|
||||
/// A handle to the icon that should be displayed. Just
|
||||
/// <c>Icon.Handle</c>.
|
||||
/// </summary>
|
||||
public IntPtr IconHandle;
|
||||
|
||||
/// <summary>
|
||||
/// String with the text for a standard ToolTip. It can have a maximum of 64 characters including
|
||||
/// the terminating NULL. For Version 5.0 and later, szTip can have a maximum of
|
||||
/// 128 characters, including the terminating NULL.
|
||||
/// </summary>
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string ToolTipText;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// State of the icon. Remember to also set the <see cref="StateMask"/>.
|
||||
/// </summary>
|
||||
public IconState IconState;
|
||||
|
||||
/// <summary>
|
||||
/// A value that specifies which bits of the state member are retrieved or modified.
|
||||
/// For example, setting this member to <see cref="Interop.IconState.Hidden"/>
|
||||
/// causes only the item's hidden
|
||||
/// state to be retrieved.
|
||||
/// </summary>
|
||||
public IconState StateMask;
|
||||
|
||||
/// <summary>
|
||||
/// String with the text for a balloon ToolTip. It can have a maximum of 255 characters.
|
||||
/// To remove the ToolTip, set the NIF_INFO flag in uFlags and set szInfo to an empty string.
|
||||
/// </summary>
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string BalloonText;
|
||||
|
||||
/// <summary>
|
||||
/// Mainly used to set the version when <see cref="WinApi.Shell_NotifyIcon"/> is invoked
|
||||
/// with <see cref="NotifyCommand.SetVersion"/>. However, for legacy operations,
|
||||
/// the same member is also used to set timouts for balloon ToolTips.
|
||||
/// </summary>
|
||||
public uint VersionOrTimeout;
|
||||
|
||||
/// <summary>
|
||||
/// String containing a title for a balloon ToolTip. This title appears in boldface
|
||||
/// above the text. It can have a maximum of 63 characters.
|
||||
/// </summary>
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] public string BalloonTitle;
|
||||
|
||||
/// <summary>
|
||||
/// Adds an icon to a balloon ToolTip, which is placed to the left of the title. If the
|
||||
/// <see cref="BalloonTitle"/> member is zero-length, the icon is not shown.
|
||||
/// </summary>
|
||||
public BalloonFlags BalloonFlags;
|
||||
|
||||
/// <summary>
|
||||
/// Windows XP (Shell32.dll version 6.0) and later.<br/>
|
||||
/// - Windows 7 and later: A registered GUID that identifies the icon.
|
||||
/// This value overrides uID and is the recommended method of identifying the icon.<br/>
|
||||
/// - Windows XP through Windows Vista: Reserved.
|
||||
/// </summary>
|
||||
public Guid TaskbarIconGuid;
|
||||
|
||||
/// <summary>
|
||||
/// Windows Vista (Shell32.dll version 6.0.6) and later. The handle of a customized
|
||||
/// balloon icon provided by the application that should be used independently
|
||||
/// of the tray icon. If this member is non-NULL and the <see cref="Interop.BalloonFlags.User"/>
|
||||
/// flag is set, this icon is used as the balloon icon.<br/>
|
||||
/// If this member is NULL, the legacy behavior is carried out.
|
||||
/// </summary>
|
||||
public IntPtr CustomBalloonIconHandle;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Creates a default data structure that provides
|
||||
/// a hidden taskbar icon without the icon being set.
|
||||
/// </summary>
|
||||
/// <param name="handle"></param>
|
||||
/// <returns></returns>
|
||||
public static NotifyIconData CreateDefault(IntPtr handle)
|
||||
{
|
||||
var data = new NotifyIconData();
|
||||
|
||||
if (Environment.OSVersion.Version.Major >= 6)
|
||||
{
|
||||
//use the current size
|
||||
data.cbSize = (uint) Marshal.SizeOf(data);
|
||||
}
|
||||
else
|
||||
{
|
||||
//we need to set another size on xp/2003- otherwise certain
|
||||
//features (e.g. balloon tooltips) don't work.
|
||||
data.cbSize = 952; // NOTIFYICONDATAW_V3_SIZE
|
||||
|
||||
//set to fixed timeout
|
||||
data.VersionOrTimeout = 10;
|
||||
}
|
||||
|
||||
data.WindowHandle = handle;
|
||||
data.TaskbarIconId = 0x0;
|
||||
data.CallbackMessageId = WindowMessageSink.CallbackMessageId;
|
||||
data.VersionOrTimeout = (uint) NotifyIconVersion.Win95;
|
||||
|
||||
data.IconHandle = IntPtr.Zero;
|
||||
|
||||
//hide initially
|
||||
data.IconState = IconState.Hidden;
|
||||
data.StateMask = IconState.Hidden;
|
||||
|
||||
//set flags
|
||||
data.ValidMembers = IconDataMembers.Message
|
||||
| IconDataMembers.Icon
|
||||
| IconDataMembers.Tip;
|
||||
|
||||
//reset strings
|
||||
data.ToolTipText = data.BalloonText = data.BalloonTitle = String.Empty;
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
namespace Hardcodet.Wpf.TaskbarNotification.Interop
|
||||
{
|
||||
/// <summary>
|
||||
/// The notify icon version that is used. The higher
|
||||
/// the version, the more capabilities are available.
|
||||
/// </summary>
|
||||
public enum NotifyIconVersion
|
||||
{
|
||||
/// <summary>
|
||||
/// Default behavior (legacy Win95). Expects
|
||||
/// a <see cref="NotifyIconData"/> size of 488.
|
||||
/// </summary>
|
||||
Win95 = 0x0,
|
||||
|
||||
/// <summary>
|
||||
/// Behavior representing Win2000 an higher. Expects
|
||||
/// a <see cref="NotifyIconData"/> size of 504.
|
||||
/// </summary>
|
||||
Win2000 = 0x3,
|
||||
|
||||
/// <summary>
|
||||
/// Extended tooltip support, which is available
|
||||
/// for Vista and later.
|
||||
/// </summary>
|
||||
Vista = 0x4
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Hardcodet.Wpf.TaskbarNotification.Interop
|
||||
{
|
||||
/// <summary>
|
||||
/// Win API struct providing coordinates for a single point.
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct Point
|
||||
{
|
||||
/// <summary>
|
||||
/// X coordinate.
|
||||
/// </summary>
|
||||
public int X;
|
||||
/// <summary>
|
||||
/// Y coordinate.
|
||||
/// </summary>
|
||||
public int Y;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,164 @@
|
||||
// Some interop code taken from Mike Marshall's AnyForm
|
||||
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
|
||||
namespace Hardcodet.Wpf.TaskbarNotification.Interop
|
||||
{
|
||||
/// <summary>
|
||||
/// Resolves the current tray position.
|
||||
/// </summary>
|
||||
public static class TrayInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the position of the system tray.
|
||||
/// </summary>
|
||||
/// <returns>Tray coordinates.</returns>
|
||||
public static Point GetTrayLocation()
|
||||
{
|
||||
var info = new AppBarInfo();
|
||||
info.GetSystemTaskBarPosition();
|
||||
|
||||
Rectangle rcWorkArea = info.WorkArea;
|
||||
|
||||
int x = 0, y = 0;
|
||||
if (info.Edge == AppBarInfo.ScreenEdge.Left)
|
||||
{
|
||||
x = rcWorkArea.Left + 2;
|
||||
y = rcWorkArea.Bottom;
|
||||
}
|
||||
else if (info.Edge == AppBarInfo.ScreenEdge.Bottom)
|
||||
{
|
||||
x = rcWorkArea.Right;
|
||||
y = rcWorkArea.Bottom;
|
||||
}
|
||||
else if (info.Edge == AppBarInfo.ScreenEdge.Top)
|
||||
{
|
||||
x = rcWorkArea.Right;
|
||||
y = rcWorkArea.Top;
|
||||
}
|
||||
else if (info.Edge == AppBarInfo.ScreenEdge.Right)
|
||||
{
|
||||
x = rcWorkArea.Right;
|
||||
y = rcWorkArea.Bottom;
|
||||
}
|
||||
|
||||
return new Point {X = x, Y = y};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
internal class AppBarInfo
|
||||
{
|
||||
[DllImport("user32.dll")]
|
||||
private static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
|
||||
|
||||
[DllImport("shell32.dll")]
|
||||
private static extern UInt32 SHAppBarMessage(UInt32 dwMessage, ref APPBARDATA data);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
private static extern Int32 SystemParametersInfo(UInt32 uiAction, UInt32 uiParam,
|
||||
IntPtr pvParam, UInt32 fWinIni);
|
||||
|
||||
|
||||
private const int ABE_BOTTOM = 3;
|
||||
private const int ABE_LEFT = 0;
|
||||
private const int ABE_RIGHT = 2;
|
||||
private const int ABE_TOP = 1;
|
||||
|
||||
private const int ABM_GETTASKBARPOS = 0x00000005;
|
||||
|
||||
// SystemParametersInfo constants
|
||||
private const UInt32 SPI_GETWORKAREA = 0x0030;
|
||||
|
||||
private APPBARDATA m_data;
|
||||
|
||||
public ScreenEdge Edge
|
||||
{
|
||||
get { return (ScreenEdge) m_data.uEdge; }
|
||||
}
|
||||
|
||||
|
||||
public Rectangle WorkArea
|
||||
{
|
||||
get
|
||||
{
|
||||
Int32 bResult = 0;
|
||||
var rc = new RECT();
|
||||
IntPtr rawRect = Marshal.AllocHGlobal(Marshal.SizeOf(rc));
|
||||
bResult = SystemParametersInfo(SPI_GETWORKAREA, 0, rawRect, 0);
|
||||
rc = (RECT) Marshal.PtrToStructure(rawRect, rc.GetType());
|
||||
|
||||
if (bResult == 1)
|
||||
{
|
||||
Marshal.FreeHGlobal(rawRect);
|
||||
return new Rectangle(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
|
||||
}
|
||||
|
||||
return new Rectangle(0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void GetPosition(string strClassName, string strWindowName)
|
||||
{
|
||||
m_data = new APPBARDATA();
|
||||
m_data.cbSize = (UInt32) Marshal.SizeOf(m_data.GetType());
|
||||
|
||||
IntPtr hWnd = FindWindow(strClassName, strWindowName);
|
||||
|
||||
if (hWnd != IntPtr.Zero)
|
||||
{
|
||||
UInt32 uResult = SHAppBarMessage(ABM_GETTASKBARPOS, ref m_data);
|
||||
|
||||
if (uResult != 1)
|
||||
{
|
||||
throw new Exception("Failed to communicate with the given AppBar");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("Failed to find an AppBar that matched the given criteria");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void GetSystemTaskBarPosition()
|
||||
{
|
||||
GetPosition("Shell_TrayWnd", null);
|
||||
}
|
||||
|
||||
|
||||
public enum ScreenEdge
|
||||
{
|
||||
Undefined = -1,
|
||||
Left = ABE_LEFT,
|
||||
Top = ABE_TOP,
|
||||
Right = ABE_RIGHT,
|
||||
Bottom = ABE_BOTTOM
|
||||
}
|
||||
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
private struct APPBARDATA
|
||||
{
|
||||
public UInt32 cbSize;
|
||||
public IntPtr hWnd;
|
||||
public UInt32 uCallbackMessage;
|
||||
public UInt32 uEdge;
|
||||
public RECT rc;
|
||||
public Int32 lParam;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
private struct RECT
|
||||
{
|
||||
public Int32 left;
|
||||
public Int32 top;
|
||||
public Int32 right;
|
||||
public Int32 bottom;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Hardcodet.Wpf.TaskbarNotification.Interop
|
||||
{
|
||||
/// <summary>
|
||||
/// Win32 API imports.
|
||||
/// </summary>
|
||||
internal static class WinApi
|
||||
{
|
||||
/// <summary>
|
||||
/// Creates, updates or deletes the taskbar icon.
|
||||
/// </summary>
|
||||
[DllImport("shell32.Dll", CharSet = CharSet.Unicode)]
|
||||
public static extern bool Shell_NotifyIcon(NotifyCommand cmd, [In] ref NotifyIconData data);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Creates the helper window that receives messages from the taskar icon.
|
||||
/// </summary>
|
||||
[DllImport("USER32.DLL", EntryPoint = "CreateWindowExW", SetLastError = true)]
|
||||
public static extern IntPtr CreateWindowEx(int dwExStyle, [MarshalAs(UnmanagedType.LPWStr)] string lpClassName,
|
||||
[MarshalAs(UnmanagedType.LPWStr)] string lpWindowName, int dwStyle, int x, int y,
|
||||
int nWidth, int nHeight, IntPtr hWndParent, IntPtr hMenu, IntPtr hInstance,
|
||||
IntPtr lpParam);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Processes a default windows procedure.
|
||||
/// </summary>
|
||||
[DllImport("USER32.DLL")]
|
||||
public static extern IntPtr DefWindowProc(IntPtr hWnd, uint msg, IntPtr wparam, IntPtr lparam);
|
||||
|
||||
/// <summary>
|
||||
/// Registers the helper window class.
|
||||
/// </summary>
|
||||
[DllImport("USER32.DLL", EntryPoint = "RegisterClassW", SetLastError = true)]
|
||||
public static extern short RegisterClass(ref WindowClass lpWndClass);
|
||||
|
||||
/// <summary>
|
||||
/// Registers a listener for a window message.
|
||||
/// </summary>
|
||||
/// <param name="lpString"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("User32.Dll", EntryPoint = "RegisterWindowMessageW")]
|
||||
public static extern uint RegisterWindowMessage([MarshalAs(UnmanagedType.LPWStr)] string lpString);
|
||||
|
||||
/// <summary>
|
||||
/// Used to destroy the hidden helper window that receives messages from the
|
||||
/// taskbar icon.
|
||||
/// </summary>
|
||||
/// <param name="hWnd"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("USER32.DLL", SetLastError = true)]
|
||||
public static extern bool DestroyWindow(IntPtr hWnd);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gives focus to a given window.
|
||||
/// </summary>
|
||||
/// <param name="hWnd"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("USER32.DLL")]
|
||||
public static extern bool SetForegroundWindow(IntPtr hWnd);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets the maximum number of milliseconds that can elapse between a
|
||||
/// first click and a second click for the OS to consider the
|
||||
/// mouse action a double-click.
|
||||
/// </summary>
|
||||
/// <returns>The maximum amount of time, in milliseconds, that can
|
||||
/// elapse between a first click and a second click for the OS to
|
||||
/// consider the mouse action a double-click.</returns>
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
|
||||
public static extern int GetDoubleClickTime();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets the screen coordinates of the current mouse position.
|
||||
/// </summary>
|
||||
[DllImport("USER32.DLL", SetLastError = true)]
|
||||
public static extern bool GetPhysicalCursorPos(ref Point lpPoint);
|
||||
|
||||
|
||||
[DllImport("USER32.DLL", SetLastError = true)]
|
||||
public static extern bool GetCursorPos(ref Point lpPoint);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Hardcodet.Wpf.TaskbarNotification.Interop
|
||||
{
|
||||
/// <summary>
|
||||
/// Callback delegate which is used by the Windows API to
|
||||
/// submit window messages.
|
||||
/// </summary>
|
||||
public delegate IntPtr WindowProcedureHandler(IntPtr hwnd, uint uMsg, IntPtr wparam, IntPtr lparam);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Win API WNDCLASS struct - represents a single window.
|
||||
/// Used to receive window messages.
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct WindowClass
|
||||
{
|
||||
#pragma warning disable 1591
|
||||
|
||||
public uint style;
|
||||
public WindowProcedureHandler lpfnWndProc;
|
||||
public int cbClsExtra;
|
||||
public int cbWndExtra;
|
||||
public IntPtr hInstance;
|
||||
public IntPtr hIcon;
|
||||
public IntPtr hCursor;
|
||||
public IntPtr hbrBackground;
|
||||
[MarshalAs(UnmanagedType.LPWStr)] public string lpszMenuName;
|
||||
[MarshalAs(UnmanagedType.LPWStr)] public string lpszClassName;
|
||||
|
||||
#pragma warning restore 1591
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,367 @@
|
||||
// hardcodet.net NotifyIcon for WPF
|
||||
// Copyright (c) 2009 - 2013 Philipp Sumi
|
||||
// Contact and Information: http://www.hardcodet.net
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the Code Project Open License (CPOL);
|
||||
// either version 1.0 of the License, or (at your option) any later
|
||||
// version.
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
// OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THIS COPYRIGHT NOTICE MAY NOT BE REMOVED FROM THIS FILE
|
||||
|
||||
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Hardcodet.Wpf.TaskbarNotification.Interop
|
||||
{
|
||||
/// <summary>
|
||||
/// Receives messages from the taskbar icon through
|
||||
/// window messages of an underlying helper window.
|
||||
/// </summary>
|
||||
public class WindowMessageSink : IDisposable
|
||||
{
|
||||
#region members
|
||||
|
||||
/// <summary>
|
||||
/// The ID of messages that are received from the the
|
||||
/// taskbar icon.
|
||||
/// </summary>
|
||||
public const int CallbackMessageId = 0x400;
|
||||
|
||||
/// <summary>
|
||||
/// The ID of the message that is being received if the
|
||||
/// taskbar is (re)started.
|
||||
/// </summary>
|
||||
private uint taskbarRestartMessageId;
|
||||
|
||||
/// <summary>
|
||||
/// Used to track whether a mouse-up event is just
|
||||
/// the aftermath of a double-click and therefore needs
|
||||
/// to be suppressed.
|
||||
/// </summary>
|
||||
private bool isDoubleClick;
|
||||
|
||||
/// <summary>
|
||||
/// A delegate that processes messages of the hidden
|
||||
/// native window that receives window messages. Storing
|
||||
/// this reference makes sure we don't loose our reference
|
||||
/// to the message window.
|
||||
/// </summary>
|
||||
private WindowProcedureHandler messageHandler;
|
||||
|
||||
/// <summary>
|
||||
/// Window class ID.
|
||||
/// </summary>
|
||||
internal string WindowId { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Handle for the message window.
|
||||
/// </summary>
|
||||
internal IntPtr MessageWindowHandle { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// The version of the underlying icon. Defines how
|
||||
/// incoming messages are interpreted.
|
||||
/// </summary>
|
||||
public NotifyIconVersion Version { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region events
|
||||
|
||||
/// <summary>
|
||||
/// The custom tooltip should be closed or hidden.
|
||||
/// </summary>
|
||||
public event Action<bool> ChangeToolTipStateRequest;
|
||||
|
||||
/// <summary>
|
||||
/// Fired in case the user clicked or moved within
|
||||
/// the taskbar icon area.
|
||||
/// </summary>
|
||||
public event Action<MouseEvent> MouseEventReceived;
|
||||
|
||||
/// <summary>
|
||||
/// Fired if a balloon ToolTip was either displayed
|
||||
/// or closed (indicated by the boolean flag).
|
||||
/// </summary>
|
||||
public event Action<bool> BalloonToolTipChanged;
|
||||
|
||||
/// <summary>
|
||||
/// Fired if the taskbar was created or restarted. Requires the taskbar
|
||||
/// icon to be reset.
|
||||
/// </summary>
|
||||
public event Action TaskbarCreated;
|
||||
|
||||
#endregion
|
||||
|
||||
#region construction
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new message sink that receives message from
|
||||
/// a given taskbar icon.
|
||||
/// </summary>
|
||||
/// <param name="version"></param>
|
||||
public WindowMessageSink(NotifyIconVersion version)
|
||||
{
|
||||
Version = version;
|
||||
CreateMessageWindow();
|
||||
}
|
||||
|
||||
|
||||
private WindowMessageSink()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Creates a dummy instance that provides an empty
|
||||
/// pointer rather than a real window handler.<br/>
|
||||
/// Used at design time.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
internal static WindowMessageSink CreateEmpty()
|
||||
{
|
||||
return new WindowMessageSink
|
||||
{
|
||||
MessageWindowHandle = IntPtr.Zero,
|
||||
Version = NotifyIconVersion.Vista
|
||||
};
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region CreateMessageWindow
|
||||
|
||||
/// <summary>
|
||||
/// Creates the helper message window that is used
|
||||
/// to receive messages from the taskbar icon.
|
||||
/// </summary>
|
||||
private void CreateMessageWindow()
|
||||
{
|
||||
//generate a unique ID for the window
|
||||
WindowId = "WPFTaskbarIcon_" + DateTime.Now.Ticks;
|
||||
|
||||
//register window message handler
|
||||
messageHandler = OnWindowMessageReceived;
|
||||
|
||||
// Create a simple window class which is reference through
|
||||
//the messageHandler delegate
|
||||
WindowClass wc;
|
||||
|
||||
wc.style = 0;
|
||||
wc.lpfnWndProc = messageHandler;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = 0;
|
||||
wc.hInstance = IntPtr.Zero;
|
||||
wc.hIcon = IntPtr.Zero;
|
||||
wc.hCursor = IntPtr.Zero;
|
||||
wc.hbrBackground = IntPtr.Zero;
|
||||
wc.lpszMenuName = "";
|
||||
wc.lpszClassName = WindowId;
|
||||
|
||||
// Register the window class
|
||||
WinApi.RegisterClass(ref wc);
|
||||
|
||||
// Get the message used to indicate the taskbar has been restarted
|
||||
// This is used to re-add icons when the taskbar restarts
|
||||
taskbarRestartMessageId = WinApi.RegisterWindowMessage("TaskbarCreated");
|
||||
|
||||
// Create the message window
|
||||
MessageWindowHandle = WinApi.CreateWindowEx(0, WindowId, "", 0, 0, 0, 1, 1, IntPtr.Zero, IntPtr.Zero,
|
||||
IntPtr.Zero, IntPtr.Zero);
|
||||
|
||||
if (MessageWindowHandle == IntPtr.Zero)
|
||||
{
|
||||
#if SILVERLIGHT
|
||||
throw new Exception("Message window handle was not a valid pointer.");
|
||||
#else
|
||||
throw new Win32Exception("Message window handle was not a valid pointer");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Handle Window Messages
|
||||
|
||||
/// <summary>
|
||||
/// Callback method that receives messages from the taskbar area.
|
||||
/// </summary>
|
||||
private IntPtr OnWindowMessageReceived(IntPtr hwnd, uint messageId, IntPtr wparam, IntPtr lparam)
|
||||
{
|
||||
if (messageId == taskbarRestartMessageId)
|
||||
{
|
||||
//recreate the icon if the taskbar was restarted (e.g. due to Win Explorer shutdown)
|
||||
TaskbarCreated();
|
||||
}
|
||||
|
||||
//forward message
|
||||
ProcessWindowMessage(messageId, wparam, lparam);
|
||||
|
||||
// Pass the message to the default window procedure
|
||||
return WinApi.DefWindowProc(hwnd, messageId, wparam, lparam);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Processes incoming system messages.
|
||||
/// </summary>
|
||||
/// <param name="msg">Callback ID.</param>
|
||||
/// <param name="wParam">If the version is <see cref="NotifyIconVersion.Vista"/>
|
||||
/// or higher, this parameter can be used to resolve mouse coordinates.
|
||||
/// Currently not in use.</param>
|
||||
/// <param name="lParam">Provides information about the event.</param>
|
||||
private void ProcessWindowMessage(uint msg, IntPtr wParam, IntPtr lParam)
|
||||
{
|
||||
if (msg != CallbackMessageId) return;
|
||||
|
||||
switch (lParam.ToInt32())
|
||||
{
|
||||
case 0x200:
|
||||
MouseEventReceived(MouseEvent.MouseMove);
|
||||
break;
|
||||
|
||||
case 0x201:
|
||||
MouseEventReceived(MouseEvent.IconLeftMouseDown);
|
||||
break;
|
||||
|
||||
case 0x202:
|
||||
if (!isDoubleClick)
|
||||
{
|
||||
MouseEventReceived(MouseEvent.IconLeftMouseUp);
|
||||
}
|
||||
isDoubleClick = false;
|
||||
break;
|
||||
|
||||
case 0x203:
|
||||
isDoubleClick = true;
|
||||
MouseEventReceived(MouseEvent.IconDoubleClick);
|
||||
break;
|
||||
|
||||
case 0x204:
|
||||
MouseEventReceived(MouseEvent.IconRightMouseDown);
|
||||
break;
|
||||
|
||||
case 0x205:
|
||||
MouseEventReceived(MouseEvent.IconRightMouseUp);
|
||||
break;
|
||||
|
||||
case 0x206:
|
||||
//double click with right mouse button - do not trigger event
|
||||
break;
|
||||
|
||||
case 0x207:
|
||||
MouseEventReceived(MouseEvent.IconMiddleMouseDown);
|
||||
break;
|
||||
|
||||
case 520:
|
||||
MouseEventReceived(MouseEvent.IconMiddleMouseUp);
|
||||
break;
|
||||
|
||||
case 0x209:
|
||||
//double click with middle mouse button - do not trigger event
|
||||
break;
|
||||
|
||||
case 0x402:
|
||||
BalloonToolTipChanged(true);
|
||||
break;
|
||||
|
||||
case 0x403:
|
||||
case 0x404:
|
||||
BalloonToolTipChanged(false);
|
||||
break;
|
||||
|
||||
case 0x405:
|
||||
MouseEventReceived(MouseEvent.BalloonToolTipClicked);
|
||||
break;
|
||||
|
||||
case 0x406:
|
||||
ChangeToolTipStateRequest(true);
|
||||
break;
|
||||
|
||||
case 0x407:
|
||||
ChangeToolTipStateRequest(false);
|
||||
break;
|
||||
|
||||
default:
|
||||
Debug.WriteLine("Unhandled NotifyIcon message ID: " + lParam);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Dispose
|
||||
|
||||
/// <summary>
|
||||
/// Set to true as soon as <c>Dispose</c> has been invoked.
|
||||
/// </summary>
|
||||
public bool IsDisposed { get; private set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Disposes the object.
|
||||
/// </summary>
|
||||
/// <remarks>This method is not virtual by design. Derived classes
|
||||
/// should override <see cref="Dispose(bool)"/>.
|
||||
/// </remarks>
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
|
||||
// This object will be cleaned up by the Dispose method.
|
||||
// Therefore, you should call GC.SupressFinalize to
|
||||
// take this object off the finalization queue
|
||||
// and prevent finalization code for this object
|
||||
// from executing a second time.
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This destructor will run only if the <see cref="Dispose()"/>
|
||||
/// method does not get called. This gives this base class the
|
||||
/// opportunity to finalize.
|
||||
/// <para>
|
||||
/// Important: Do not provide destructors in types derived from
|
||||
/// this class.
|
||||
/// </para>
|
||||
/// </summary>
|
||||
~WindowMessageSink()
|
||||
{
|
||||
Dispose(false);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Removes the windows hook that receives window
|
||||
/// messages and closes the underlying helper window.
|
||||
/// </summary>
|
||||
private void Dispose(bool disposing)
|
||||
{
|
||||
//don't do anything if the component is already disposed
|
||||
if (IsDisposed) return;
|
||||
IsDisposed = true;
|
||||
|
||||
//always destroy the unmanaged handle (even if called from the GC)
|
||||
WinApi.DestroyWindow(MessageWindowHandle);
|
||||
messageHandler = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{7AC63864-7638-41C4-969C-D3197EF2BED9}</ProjectGuid>
|
||||
<OutputType>library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Hardcodet.Wpf.TaskbarNotification</RootNamespace>
|
||||
<AssemblyName>Hardcodet.Wpf.TaskbarNotification</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<DocumentationFile>bin\Release\Hardcodet.Wpf.TaskbarNotification.xml</DocumentationFile>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Xaml" />
|
||||
<Reference Include="WindowsBase" />
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="BalloonIcon.cs" />
|
||||
<Compile Include="Interop\TrayInfo.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Interop\Point.cs" />
|
||||
<Compile Include="Interop\WindowClass.cs" />
|
||||
<Compile Include="PopupActivationMode.cs" />
|
||||
<Compile Include="RoutedEventHelper.cs" />
|
||||
<Compile Include="Interop\WinApi.cs" />
|
||||
<Compile Include="Interop\MouseEvent.cs" />
|
||||
<Compile Include="Interop\NotifyCommand.cs" />
|
||||
<Compile Include="Interop\NotifyIconData.cs" />
|
||||
<Compile Include="Interop\IconDataMembers.cs" />
|
||||
<Compile Include="Interop\IconState.cs" />
|
||||
<Compile Include="Interop\NotifyIconVersion.cs" />
|
||||
<Compile Include="Interop\BalloonFlags.cs" />
|
||||
<Compile Include="Interop\WindowMessageSink.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="TaskbarIcon.cs" />
|
||||
<Compile Include="TaskbarIcon.Declarations.cs" />
|
||||
<Compile Include="Util.cs" />
|
||||
<None Include="Diagrams\TaskbarIcon Overview.cd" />
|
||||
<AppDesigner Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,75 @@
|
||||
// hardcodet.net NotifyIcon for WPF
|
||||
// Copyright (c) 2009 - 2013 Philipp Sumi
|
||||
// Contact and Information: http://www.hardcodet.net
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the Code Project Open License (CPOL);
|
||||
// either version 1.0 of the License, or (at your option) any later
|
||||
// version.
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
// OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THIS COPYRIGHT NOTICE MAY NOT BE REMOVED FROM THIS FILE
|
||||
|
||||
|
||||
namespace Hardcodet.Wpf.TaskbarNotification
|
||||
{
|
||||
/// <summary>
|
||||
/// Defines flags that define when a popup
|
||||
/// is being displyed.
|
||||
/// </summary>
|
||||
public enum PopupActivationMode
|
||||
{
|
||||
/// <summary>
|
||||
/// The item is displayed if the user clicks the
|
||||
/// tray icon with the left mouse button.
|
||||
/// </summary>
|
||||
LeftClick,
|
||||
|
||||
/// <summary>
|
||||
/// The item is displayed if the user clicks the
|
||||
/// tray icon with the right mouse button.
|
||||
/// </summary>
|
||||
RightClick,
|
||||
|
||||
/// <summary>
|
||||
/// The item is displayed if the user double-clicks the
|
||||
/// tray icon.
|
||||
/// </summary>
|
||||
DoubleClick,
|
||||
|
||||
/// <summary>
|
||||
/// The item is displayed if the user clicks the
|
||||
/// tray icon with the left or the right mouse button.
|
||||
/// </summary>
|
||||
LeftOrRightClick,
|
||||
|
||||
/// <summary>
|
||||
/// The item is displayed if the user clicks the
|
||||
/// tray icon with the left mouse button or if a
|
||||
/// double-click is being performed.
|
||||
/// </summary>
|
||||
LeftOrDoubleClick,
|
||||
|
||||
/// <summary>
|
||||
/// The item is displayed if the user clicks the
|
||||
/// tray icon with the middle mouse button.
|
||||
/// </summary>
|
||||
MiddleClick,
|
||||
|
||||
/// <summary>
|
||||
/// The item is displayed whenever a click occurs.
|
||||
/// </summary>
|
||||
All
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows;
|
||||
using System.Windows.Markup;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
|
||||
[assembly: AssemblyTitle("NotifyIcon for WPF")]
|
||||
[assembly: AssemblyDescription("NotifyIcon implementation for the WPF platform.")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("hardcodet.net")]
|
||||
[assembly: AssemblyProduct("NotifyIcon WPF")]
|
||||
[assembly: AssemblyCopyright("Copyright © Philipp Sumi 2013")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
|
||||
[assembly: AssemblyVersion("1.0.5.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.5.0")]
|
||||
|
||||
|
||||
//provides simplified declaration in XAML
|
||||
[assembly: XmlnsPrefix("http://www.hardcodet.net/taskbar", "tb")]
|
||||
[assembly: XmlnsDefinition("http://www.hardcodet.net/taskbar", "Hardcodet.Wpf.TaskbarNotification")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
//In order to begin building localizable applications, set
|
||||
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
|
||||
//inside a <PropertyGroup>. For example, if you are using US english
|
||||
//in your source files, set the <UICulture> to en-US. Then uncomment
|
||||
//the NeutralResourceLanguage attribute below. Update the "en-US" in
|
||||
//the line below to match the UICulture setting in the project file.
|
||||
|
||||
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
|
||||
|
||||
[assembly: ThemeInfo(
|
||||
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
|
||||
//(used if a resource is not found in the page,
|
||||
// or application resource dictionaries)
|
||||
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
|
||||
//(used if a resource is not found in the page,
|
||||
// app, or any theme specific resource dictionaries)
|
||||
)]
|
||||
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
using System;
|
||||
using System.Windows;
|
||||
|
||||
namespace Hardcodet.Wpf.TaskbarNotification
|
||||
{
|
||||
/// <summary>
|
||||
/// Helper class used by routed events of the
|
||||
/// <see cref="TaskbarIcon"/> class.
|
||||
/// </summary>
|
||||
internal static class RoutedEventHelper
|
||||
{
|
||||
#region RoutedEvent Helper Methods
|
||||
|
||||
/// <summary>
|
||||
/// A static helper method to raise a routed event on a target UIElement or ContentElement.
|
||||
/// </summary>
|
||||
/// <param name="target">UIElement or ContentElement on which to raise the event</param>
|
||||
/// <param name="args">RoutedEventArgs to use when raising the event</param>
|
||||
internal static void RaiseEvent(DependencyObject target, RoutedEventArgs args)
|
||||
{
|
||||
if (target is UIElement)
|
||||
{
|
||||
(target as UIElement).RaiseEvent(args);
|
||||
}
|
||||
else if (target is ContentElement)
|
||||
{
|
||||
(target as ContentElement).RaiseEvent(args);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A static helper method that adds a handler for a routed event
|
||||
/// to a target UIElement or ContentElement.
|
||||
/// </summary>
|
||||
/// <param name="element">UIElement or ContentElement that listens to the event</param>
|
||||
/// <param name="routedEvent">Event that will be handled</param>
|
||||
/// <param name="handler">Event handler to be added</param>
|
||||
internal static void AddHandler(DependencyObject element, RoutedEvent routedEvent, Delegate handler)
|
||||
{
|
||||
UIElement uie = element as UIElement;
|
||||
if (uie != null)
|
||||
{
|
||||
uie.AddHandler(routedEvent, handler);
|
||||
}
|
||||
else
|
||||
{
|
||||
ContentElement ce = element as ContentElement;
|
||||
if (ce != null)
|
||||
{
|
||||
ce.AddHandler(routedEvent, handler);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A static helper method that removes a handler for a routed event
|
||||
/// from a target UIElement or ContentElement.
|
||||
/// </summary>
|
||||
/// <param name="element">UIElement or ContentElement that listens to the event</param>
|
||||
/// <param name="routedEvent">Event that will no longer be handled</param>
|
||||
/// <param name="handler">Event handler to be removed</param>
|
||||
internal static void RemoveHandler(DependencyObject element, RoutedEvent routedEvent, Delegate handler)
|
||||
{
|
||||
UIElement uie = element as UIElement;
|
||||
if (uie != null)
|
||||
{
|
||||
uie.RemoveHandler(routedEvent, handler);
|
||||
}
|
||||
else
|
||||
{
|
||||
ContentElement ce = element as ContentElement;
|
||||
if (ce != null)
|
||||
{
|
||||
ce.RemoveHandler(routedEvent, handler);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
1092
Hardcodet.NotifyIcon.Wpf/Source/NotifyIconWpf/TaskbarIcon.cs
Normal file
309
Hardcodet.NotifyIcon.Wpf/Source/NotifyIconWpf/Util.cs
Normal file
@@ -0,0 +1,309 @@
|
||||
// hardcodet.net NotifyIcon for WPF
|
||||
// Copyright (c) 2009 - 2013 Philipp Sumi
|
||||
// Contact and Information: http://www.hardcodet.net
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the Code Project Open License (CPOL);
|
||||
// either version 1.0 of the License, or (at your option) any later
|
||||
// version.
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
// OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THIS COPYRIGHT NOTICE MAY NOT BE REMOVED FROM THIS FILE
|
||||
|
||||
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Resources;
|
||||
using System.Windows.Threading;
|
||||
using Hardcodet.Wpf.TaskbarNotification.Interop;
|
||||
|
||||
namespace Hardcodet.Wpf.TaskbarNotification
|
||||
{
|
||||
/// <summary>
|
||||
/// Util and extension methods.
|
||||
/// </summary>
|
||||
internal static class Util
|
||||
{
|
||||
public static readonly object SyncRoot = new object();
|
||||
|
||||
#region IsDesignMode
|
||||
|
||||
private static readonly bool isDesignMode;
|
||||
|
||||
/// <summary>
|
||||
/// Checks whether the application is currently in design mode.
|
||||
/// </summary>
|
||||
public static bool IsDesignMode
|
||||
{
|
||||
get { return isDesignMode; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region construction
|
||||
|
||||
static Util()
|
||||
{
|
||||
isDesignMode =
|
||||
(bool)
|
||||
DependencyPropertyDescriptor.FromProperty(DesignerProperties.IsInDesignModeProperty,
|
||||
typeof (FrameworkElement))
|
||||
.Metadata.DefaultValue;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region CreateHelperWindow
|
||||
|
||||
/// <summary>
|
||||
/// Creates an transparent window without dimension that
|
||||
/// can be used to temporarily obtain focus and/or
|
||||
/// be used as a window message sink.
|
||||
/// </summary>
|
||||
/// <returns>Empty window.</returns>
|
||||
public static Window CreateHelperWindow()
|
||||
{
|
||||
return new Window
|
||||
{
|
||||
Width = 0,
|
||||
Height = 0,
|
||||
ShowInTaskbar = false,
|
||||
WindowStyle = WindowStyle.None,
|
||||
AllowsTransparency = true,
|
||||
Opacity = 0
|
||||
};
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region WriteIconData
|
||||
|
||||
/// <summary>
|
||||
/// Updates the taskbar icons with data provided by a given
|
||||
/// <see cref="NotifyIconData"/> instance.
|
||||
/// </summary>
|
||||
/// <param name="data">Configuration settings for the NotifyIcon.</param>
|
||||
/// <param name="command">Operation on the icon (e.g. delete the icon).</param>
|
||||
/// <returns>True if the data was successfully written.</returns>
|
||||
/// <remarks>See Shell_NotifyIcon documentation on MSDN for details.</remarks>
|
||||
public static bool WriteIconData(ref NotifyIconData data, NotifyCommand command)
|
||||
{
|
||||
return WriteIconData(ref data, command, data.ValidMembers);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Updates the taskbar icons with data provided by a given
|
||||
/// <see cref="NotifyIconData"/> instance.
|
||||
/// </summary>
|
||||
/// <param name="data">Configuration settings for the NotifyIcon.</param>
|
||||
/// <param name="command">Operation on the icon (e.g. delete the icon).</param>
|
||||
/// <param name="flags">Defines which members of the <paramref name="data"/>
|
||||
/// structure are set.</param>
|
||||
/// <returns>True if the data was successfully written.</returns>
|
||||
/// <remarks>See Shell_NotifyIcon documentation on MSDN for details.</remarks>
|
||||
public static bool WriteIconData(ref NotifyIconData data, NotifyCommand command, IconDataMembers flags)
|
||||
{
|
||||
//do nothing if in design mode
|
||||
if (IsDesignMode) return true;
|
||||
|
||||
data.ValidMembers = flags;
|
||||
lock (SyncRoot)
|
||||
{
|
||||
return WinApi.Shell_NotifyIcon(command, ref data);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetBalloonFlag
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="BalloonFlags"/> enum value that
|
||||
/// matches a given <see cref="BalloonIcon"/>.
|
||||
/// </summary>
|
||||
public static BalloonFlags GetBalloonFlag(this BalloonIcon icon)
|
||||
{
|
||||
switch (icon)
|
||||
{
|
||||
case BalloonIcon.None:
|
||||
return BalloonFlags.None;
|
||||
case BalloonIcon.Info:
|
||||
return BalloonFlags.Info;
|
||||
case BalloonIcon.Warning:
|
||||
return BalloonFlags.Warning;
|
||||
case BalloonIcon.Error:
|
||||
return BalloonFlags.Error;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException("icon");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region ImageSource to Icon
|
||||
|
||||
/// <summary>
|
||||
/// Reads a given image resource into a WinForms icon.
|
||||
/// </summary>
|
||||
/// <param name="imageSource">Image source pointing to
|
||||
/// an icon file (*.ico).</param>
|
||||
/// <returns>An icon object that can be used with the
|
||||
/// taskbar area.</returns>
|
||||
public static Icon ToIcon(this ImageSource imageSource)
|
||||
{
|
||||
if (imageSource == null) return null;
|
||||
|
||||
Uri uri = new Uri(imageSource.ToString());
|
||||
StreamResourceInfo streamInfo = Application.GetResourceStream(uri);
|
||||
|
||||
if (streamInfo == null)
|
||||
{
|
||||
string msg = "The supplied image source '{0}' could not be resolved.";
|
||||
msg = String.Format(msg, imageSource);
|
||||
throw new ArgumentException(msg);
|
||||
}
|
||||
|
||||
return new Icon(streamInfo.Stream);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region evaluate listings
|
||||
|
||||
/// <summary>
|
||||
/// Checks a list of candidates for equality to a given
|
||||
/// reference value.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="value">The evaluated value.</param>
|
||||
/// <param name="candidates">A liste of possible values that are
|
||||
/// regarded valid.</param>
|
||||
/// <returns>True if one of the submitted <paramref name="candidates"/>
|
||||
/// matches the evaluated value. If the <paramref name="candidates"/>
|
||||
/// parameter itself is null, too, the method returns false as well,
|
||||
/// which allows to check with null values, too.</returns>
|
||||
/// <exception cref="ArgumentNullException">If <paramref name="candidates"/>
|
||||
/// is a null reference.</exception>
|
||||
public static bool Is<T>(this T value, params T[] candidates)
|
||||
{
|
||||
if (candidates == null) return false;
|
||||
|
||||
foreach (var t in candidates)
|
||||
{
|
||||
if (value.Equals(t)) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region match MouseEvent to PopupActivation
|
||||
|
||||
/// <summary>
|
||||
/// Checks if a given <see cref="PopupActivationMode"/> is a match for
|
||||
/// an effectively pressed mouse button.
|
||||
/// </summary>
|
||||
public static bool IsMatch(this MouseEvent me, PopupActivationMode activationMode)
|
||||
{
|
||||
switch (activationMode)
|
||||
{
|
||||
case PopupActivationMode.LeftClick:
|
||||
return me == MouseEvent.IconLeftMouseUp;
|
||||
case PopupActivationMode.RightClick:
|
||||
return me == MouseEvent.IconRightMouseUp;
|
||||
case PopupActivationMode.LeftOrRightClick:
|
||||
return me.Is(MouseEvent.IconLeftMouseUp, MouseEvent.IconRightMouseUp);
|
||||
case PopupActivationMode.LeftOrDoubleClick:
|
||||
return me.Is(MouseEvent.IconLeftMouseUp, MouseEvent.IconDoubleClick);
|
||||
case PopupActivationMode.DoubleClick:
|
||||
return me.Is(MouseEvent.IconDoubleClick);
|
||||
case PopupActivationMode.MiddleClick:
|
||||
return me == MouseEvent.IconMiddleMouseUp;
|
||||
case PopupActivationMode.All:
|
||||
//return true for everything except mouse movements
|
||||
return me != MouseEvent.MouseMove;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException("activationMode");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region execute command
|
||||
|
||||
/// <summary>
|
||||
/// Executes a given command if its <see cref="ICommand.CanExecute"/> method
|
||||
/// indicates it can run.
|
||||
/// </summary>
|
||||
/// <param name="command">The command to be executed, or a null reference.</param>
|
||||
/// <param name="commandParameter">An optional parameter that is associated with
|
||||
/// the command.</param>
|
||||
/// <param name="target">The target element on which to raise the command.</param>
|
||||
public static void ExecuteIfEnabled(this ICommand command, object commandParameter, IInputElement target)
|
||||
{
|
||||
if (command == null) return;
|
||||
|
||||
RoutedCommand rc = command as RoutedCommand;
|
||||
if (rc != null)
|
||||
{
|
||||
//routed commands work on a target
|
||||
if (rc.CanExecute(commandParameter, target)) rc.Execute(commandParameter, target);
|
||||
}
|
||||
else if (command.CanExecute(commandParameter))
|
||||
{
|
||||
command.Execute(commandParameter);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Returns a dispatcher for multi-threaded scenarios
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
internal static Dispatcher GetDispatcher(this DispatcherObject source)
|
||||
{
|
||||
//use the application's dispatcher by default
|
||||
if (Application.Current != null) return Application.Current.Dispatcher;
|
||||
|
||||
//fallback for WinForms environments
|
||||
if (source.Dispatcher != null) return source.Dispatcher;
|
||||
|
||||
//ultimatively use the thread's dispatcher
|
||||
return Dispatcher.CurrentDispatcher;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Checks whether the <see cref="FrameworkElement.DataContextProperty"/>
|
||||
/// is bound or not.
|
||||
/// </summary>
|
||||
/// <param name="element">The element to be checked.</param>
|
||||
/// <returns>True if the data context property is being managed by a
|
||||
/// binding expression.</returns>
|
||||
/// <exception cref="ArgumentNullException">If <paramref name="element"/>
|
||||
/// is a null reference.</exception>
|
||||
public static bool IsDataContextDataBound(this FrameworkElement element)
|
||||
{
|
||||
if (element == null) throw new ArgumentNullException("element");
|
||||
return element.GetBindingExpression(FrameworkElement.DataContextProperty) != null;
|
||||
}
|
||||
}
|
||||
}
|
||||
14
Hardcodet.NotifyIcon.Wpf/Source/Sample Project/App.xaml
Normal file
@@ -0,0 +1,14 @@
|
||||
<Application x:Class="Samples.App"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
StartupUri="Main.xaml">
|
||||
<Application.Resources>
|
||||
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="Showcase/NotifyIconResources.xaml" />
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
|
||||
</Application.Resources>
|
||||
</Application>
|
||||
17
Hardcodet.NotifyIcon.Wpf/Source/Sample Project/App.xaml.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
|
||||
namespace Samples
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for App.xaml
|
||||
/// </summary>
|
||||
public partial class App : Application
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace Samples.Commands
|
||||
{
|
||||
/// <summary>
|
||||
/// Closes the current window.
|
||||
/// </summary>
|
||||
public class CloseWindowCommand : CommandBase<CloseWindowCommand>
|
||||
{
|
||||
public override void Execute(object parameter)
|
||||
{
|
||||
GetTaskbarWindow(parameter).Close();
|
||||
CommandManager.InvalidateRequerySuggested();
|
||||
}
|
||||
|
||||
|
||||
public override bool CanExecute(object parameter)
|
||||
{
|
||||
Window win = GetTaskbarWindow(parameter);
|
||||
return win != null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Markup;
|
||||
using System.Windows.Media;
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
|
||||
namespace Samples.Commands
|
||||
{
|
||||
/// <summary>
|
||||
/// Basic implementation of the <see cref="ICommand"/>
|
||||
/// interface, which is also accessible as a markup
|
||||
/// extension.
|
||||
/// </summary>
|
||||
public abstract class CommandBase<T> : MarkupExtension, ICommand
|
||||
where T : class, ICommand, new()
|
||||
{
|
||||
/// <summary>
|
||||
/// A singleton instance.
|
||||
/// </summary>
|
||||
private static T command;
|
||||
|
||||
/// <summary>
|
||||
/// Gets a shared command instance.
|
||||
/// </summary>
|
||||
public override object ProvideValue(IServiceProvider serviceProvider)
|
||||
{
|
||||
if (command == null) command = new T();
|
||||
return command;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fires when changes occur that affect whether
|
||||
/// or not the command should execute.
|
||||
/// </summary>
|
||||
public event EventHandler CanExecuteChanged
|
||||
{
|
||||
add { CommandManager.RequerySuggested += value; }
|
||||
remove { CommandManager.RequerySuggested -= value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Defines the method to be called when the command is invoked.
|
||||
/// </summary>
|
||||
/// <param name="parameter">Data used by the command.
|
||||
/// If the command does not require data to be passed,
|
||||
/// this object can be set to null.
|
||||
/// </param>
|
||||
public abstract void Execute(object parameter);
|
||||
|
||||
/// <summary>
|
||||
/// Defines the method that determines whether the command
|
||||
/// can execute in its current state.
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// This default implementation always returns true.
|
||||
/// </returns>
|
||||
/// <param name="parameter">Data used by the command.
|
||||
/// If the command does not require data to be passed,
|
||||
/// this object can be set to null.
|
||||
/// </param>
|
||||
public virtual bool CanExecute(object parameter)
|
||||
{
|
||||
return IsDesignMode ? false : true;
|
||||
}
|
||||
|
||||
|
||||
public static bool IsDesignMode
|
||||
{
|
||||
get
|
||||
{
|
||||
return (bool)
|
||||
DependencyPropertyDescriptor.FromProperty(DesignerProperties.IsInDesignModeProperty,
|
||||
typeof (FrameworkElement))
|
||||
.Metadata.DefaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Resolves the window that owns the TaskbarIcon class.
|
||||
/// </summary>
|
||||
/// <param name="commandParameter"></param>
|
||||
/// <returns></returns>
|
||||
protected Window GetTaskbarWindow(object commandParameter)
|
||||
{
|
||||
if (IsDesignMode) return null;
|
||||
|
||||
//get the showcase window off the taskbaricon
|
||||
var tb = commandParameter as TaskbarIcon;
|
||||
return tb == null ? null : TryFindParent<Window>(tb);
|
||||
}
|
||||
|
||||
#region TryFindParent helper
|
||||
|
||||
/// <summary>
|
||||
/// Finds a parent of a given item on the visual tree.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The type of the queried item.</typeparam>
|
||||
/// <param name="child">A direct or indirect child of the
|
||||
/// queried item.</param>
|
||||
/// <returns>The first parent item that matches the submitted
|
||||
/// type parameter. If not matching item can be found, a null
|
||||
/// reference is being returned.</returns>
|
||||
public static T TryFindParent<T>(DependencyObject child)
|
||||
where T : DependencyObject
|
||||
{
|
||||
//get parent item
|
||||
DependencyObject parentObject = GetParentObject(child);
|
||||
|
||||
//we've reached the end of the tree
|
||||
if (parentObject == null) return null;
|
||||
|
||||
//check if the parent matches the type we're looking for
|
||||
T parent = parentObject as T;
|
||||
if (parent != null)
|
||||
{
|
||||
return parent;
|
||||
}
|
||||
else
|
||||
{
|
||||
//use recursion to proceed with next level
|
||||
return TryFindParent<T>(parentObject);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This method is an alternative to WPF's
|
||||
/// <see cref="VisualTreeHelper.GetParent"/> method, which also
|
||||
/// supports content elements. Keep in mind that for content element,
|
||||
/// this method falls back to the logical tree of the element!
|
||||
/// </summary>
|
||||
/// <param name="child">The item to be processed.</param>
|
||||
/// <returns>The submitted item's parent, if available. Otherwise
|
||||
/// null.</returns>
|
||||
public static DependencyObject GetParentObject(DependencyObject child)
|
||||
{
|
||||
if (child == null) return null;
|
||||
ContentElement contentElement = child as ContentElement;
|
||||
|
||||
if (contentElement != null)
|
||||
{
|
||||
DependencyObject parent = ContentOperations.GetParent(contentElement);
|
||||
if (parent != null) return parent;
|
||||
|
||||
FrameworkContentElement fce = contentElement as FrameworkContentElement;
|
||||
return fce != null ? fce.Parent : null;
|
||||
}
|
||||
|
||||
//if it's not a ContentElement, rely on VisualTreeHelper
|
||||
return VisualTreeHelper.GetParent(child);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace Samples.Commands
|
||||
{
|
||||
/// <summary>
|
||||
/// Hides the main window.
|
||||
/// </summary>
|
||||
public class HideSampleWindowCommand : CommandBase<HideSampleWindowCommand>
|
||||
{
|
||||
public override void Execute(object parameter)
|
||||
{
|
||||
GetTaskbarWindow(parameter).Hide();
|
||||
CommandManager.InvalidateRequerySuggested();
|
||||
}
|
||||
|
||||
|
||||
public override bool CanExecute(object parameter)
|
||||
{
|
||||
Window win = GetTaskbarWindow(parameter);
|
||||
return win != null && win.IsVisible;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace Samples.Commands
|
||||
{
|
||||
/// <summary>
|
||||
/// Shows the main window.
|
||||
/// </summary>
|
||||
public class ShowSampleWindowCommand : CommandBase<ShowSampleWindowCommand>
|
||||
{
|
||||
public override void Execute(object parameter)
|
||||
{
|
||||
GetTaskbarWindow(parameter).Show();
|
||||
CommandManager.InvalidateRequerySuggested();
|
||||
}
|
||||
|
||||
|
||||
public override bool CanExecute(object parameter)
|
||||
{
|
||||
Window win = GetTaskbarWindow(parameter);
|
||||
return win != null && !win.IsVisible;
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
Hardcodet.NotifyIcon.Wpf/Source/Sample Project/Icons/Bulb.ico
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
BIN
Hardcodet.NotifyIcon.Wpf/Source/Sample Project/Icons/Error.ico
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 41 KiB |
BIN
Hardcodet.NotifyIcon.Wpf/Source/Sample Project/Images/Add.png
Normal file
|
After Width: | Height: | Size: 502 B |
BIN
Hardcodet.NotifyIcon.Wpf/Source/Sample Project/Images/Close.png
Normal file
|
After Width: | Height: | Size: 667 B |
BIN
Hardcodet.NotifyIcon.Wpf/Source/Sample Project/Images/Info.png
Normal file
|
After Width: | Height: | Size: 6.9 KiB |
BIN
Hardcodet.NotifyIcon.Wpf/Source/Sample Project/Images/Logo.png
Normal file
|
After Width: | Height: | Size: 113 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
BIN
Hardcodet.NotifyIcon.Wpf/Source/Sample Project/Images/Remove.png
Normal file
|
After Width: | Height: | Size: 237 B |
242
Hardcodet.NotifyIcon.Wpf/Source/Sample Project/Main.xaml
Normal file
@@ -0,0 +1,242 @@
|
||||
<Window
|
||||
x:Class="Samples.Main"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
Title="NotifyIcon Samples"
|
||||
Height="626"
|
||||
Width="703"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d" ResizeMode="NoResize">
|
||||
<Grid
|
||||
Hyperlink.RequestNavigate="OnNavigationRequest">
|
||||
<Grid.Background>
|
||||
<LinearGradientBrush
|
||||
EndPoint="0.673,0.95"
|
||||
StartPoint="0.274,0.137">
|
||||
<GradientStop
|
||||
Color="#FFFFFFFF"
|
||||
Offset="0" />
|
||||
<GradientStop
|
||||
Color="#FFB4C6D8"
|
||||
Offset="0.982" />
|
||||
</LinearGradientBrush>
|
||||
</Grid.Background>
|
||||
|
||||
<TextBlock
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,10,0,0"
|
||||
VerticalAlignment="Top"
|
||||
FontSize="14"
|
||||
FontStyle="Italic"
|
||||
FontWeight="Bold"
|
||||
TextWrapping="Wrap" Text="WPF NotifyIcon 1.0.5 - Samples"/>
|
||||
<Button
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,133,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Width="164"
|
||||
Height="27"
|
||||
Content="NotifyIcon Declaration"
|
||||
x:Name="btnDeclaration"
|
||||
Click="btnDeclaration_Click" />
|
||||
<TextBlock
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,50,0,0"
|
||||
VerticalAlignment="Top"
|
||||
FontWeight="Bold"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Text="Tutorials:" />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,75.96,0,0"
|
||||
VerticalAlignment="Top"
|
||||
TextWrapping="Wrap"
|
||||
Width="224.31"
|
||||
Height="47.04"
|
||||
d:LayoutOverrides="HorizontalAlignment">
|
||||
<Run
|
||||
Text="Tutorials follow the contents of the CodeProject article. Check the "Tutorials" folder for the source code." />
|
||||
</TextBlock>
|
||||
<Button
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,170,0,0"
|
||||
Width="164"
|
||||
Content="ToolTips - Inline Declaration"
|
||||
VerticalAlignment="Top"
|
||||
Height="27"
|
||||
x:Name="btnInlineToolTip"
|
||||
Click="btnInlineToolTip_Click" />
|
||||
<Button
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,244,0,0"
|
||||
Width="164"
|
||||
Content="Popups"
|
||||
VerticalAlignment="Top"
|
||||
Height="27"
|
||||
x:Name="btnPopups"
|
||||
Click="btnPopups_Click" />
|
||||
<Button
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,281,0,0"
|
||||
Width="164"
|
||||
Content="Context Menus"
|
||||
VerticalAlignment="Top"
|
||||
Height="27"
|
||||
x:Name="btnContextMenus"
|
||||
Click="btnContextMenus_Click" />
|
||||
<Button
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,318,0,0"
|
||||
Width="164"
|
||||
Content="Balloon Tips"
|
||||
VerticalAlignment="Top"
|
||||
Height="27"
|
||||
x:Name="btnBalloons"
|
||||
Click="btnBalloons_Click" />
|
||||
<Button
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,355,0,0"
|
||||
Width="164"
|
||||
Content="Commands"
|
||||
VerticalAlignment="Top"
|
||||
Height="27"
|
||||
x:Name="btnCommands"
|
||||
Click="btnCommands_Click" />
|
||||
<Button
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,207,0,0"
|
||||
Width="164"
|
||||
Content="ToolTip User Control"
|
||||
Height="27"
|
||||
VerticalAlignment="Top"
|
||||
x:Name="btnToolTipControl"
|
||||
Click="btnToolTipControl_Click" />
|
||||
<TextBlock
|
||||
Margin="255.31,50,0,0"
|
||||
VerticalAlignment="Top"
|
||||
FontWeight="Bold"
|
||||
TextWrapping="Wrap"
|
||||
HorizontalAlignment="Left" Width="110.93">
|
||||
<Run
|
||||
Text="Showcase Sample:" />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
Margin="255.31,75.96,145.38,0"
|
||||
VerticalAlignment="Top"
|
||||
TextWrapping="Wrap"
|
||||
Height="47.04">
|
||||
<Run
|
||||
Text="An interactive sample that shows off most features on a single NotifyIcon." />
|
||||
</TextBlock>
|
||||
<Button
|
||||
Margin="255.31,133,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Height="27"
|
||||
Content="Open Sample Window"
|
||||
x:Name="btnMainSample"
|
||||
Click="btnMainSample_Click"
|
||||
Width="164"
|
||||
HorizontalAlignment="Left" />
|
||||
<Path
|
||||
Fill="#FFFFFFFF"
|
||||
Stretch="Fill"
|
||||
Stroke="#FF60758A"
|
||||
HorizontalAlignment="Left"
|
||||
Margin="244.31,50,0,66"
|
||||
Width="1"
|
||||
Data="M269,57 L269,390.18163" Opacity="0.325" />
|
||||
<TextBlock
|
||||
Margin="255.31,191,10,0"
|
||||
TextWrapping="Wrap"
|
||||
VerticalAlignment="Top">
|
||||
<Run Text="The latest news related to the component can be found on the project page:" />
|
||||
<LineBreak />
|
||||
<Hyperlink NavigateUri="http://www.hardcodet.net/wpf-notifyicon">
|
||||
<Run Text="http://www.hardcodet.net/wpf-notifyicon" />
|
||||
</Hyperlink>
|
||||
<LineBreak />
|
||||
<LineBreak />
|
||||
<Run
|
||||
Text="Critical feedback is appreciated - please post bug reports, requests, questions etc. to the CodeProject forum" />
|
||||
<Run Language="de-ch" Text=":" />
|
||||
<LineBreak />
|
||||
<Hyperlink NavigateUri="http://www.codeproject.com/KB/WPF/wpf_notifyicon.aspx">
|
||||
<Run Text="http://www.codeproject.com/KB/WPF/wpf_notifyicon.aspx" />
|
||||
</Hyperlink>
|
||||
<LineBreak />
|
||||
<LineBreak />
|
||||
<LineBreak />
|
||||
<TextBlock>
|
||||
<Run Text="Love it or hate it? Please let me know and " />
|
||||
<Hyperlink NavigateUri="http://www.codeproject.com/KB/WPF/wpf_notifyicon.aspx">
|
||||
<Run FontWeight="Bold" Text="rate the project" />
|
||||
</Hyperlink>
|
||||
<Run Text=" - thanks!" />
|
||||
</TextBlock>
|
||||
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
Margin="10,0,10,10"
|
||||
VerticalAlignment="Bottom"
|
||||
Height="22.42"
|
||||
TextWrapping="Wrap"
|
||||
FontWeight="Bold">
|
||||
<Run
|
||||
Text="WPF NotifyIcon is free software, released under the" />
|
||||
<Run
|
||||
Text=" " />
|
||||
<Hyperlink
|
||||
NavigateUri="http://www.codeproject.com/info/cpol10.aspx">
|
||||
<Run
|
||||
Text="CodeProject Open License" />
|
||||
</Hyperlink>
|
||||
</TextBlock>
|
||||
<Path
|
||||
Fill="#FFFFFFFF"
|
||||
Stretch="Fill"
|
||||
Stroke="#FF60758A"
|
||||
Margin="11,0,17.926,41"
|
||||
VerticalAlignment="Bottom"
|
||||
Height="1"
|
||||
Data="M11,517 L561.07363,517" Opacity="0.33" />
|
||||
<Button
|
||||
Margin="10,466,0,0"
|
||||
Content="Events"
|
||||
VerticalAlignment="Top"
|
||||
Height="27"
|
||||
x:Name="btnEvents"
|
||||
Click="btnEvents_Click" Width="164" HorizontalAlignment="Left" />
|
||||
<Button
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,392,0,0"
|
||||
Width="164"
|
||||
Content="Data Binding"
|
||||
VerticalAlignment="Top"
|
||||
Height="27"
|
||||
x:Name="btnDataBinding"
|
||||
Click="btnDataBinding_Click" />
|
||||
<Button
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,429,0,0"
|
||||
Width="164"
|
||||
Content="MVVM"
|
||||
VerticalAlignment="Top"
|
||||
Height="27"
|
||||
x:Name="btnMvvm"
|
||||
Click="btnMvvm_Click" />
|
||||
<Image Margin="562.24,-19,-41.24,440" Source="Images/Logo.png" Stretch="Fill" RenderTransformOrigin="0.5,0.5" Opacity="0.235">
|
||||
<Image.RenderTransform>
|
||||
<TransformGroup>
|
||||
<ScaleTransform/>
|
||||
<SkewTransform/>
|
||||
<RotateTransform Angle="-34.915"/>
|
||||
<TranslateTransform/>
|
||||
</TransformGroup>
|
||||
</Image.RenderTransform>
|
||||
</Image>
|
||||
|
||||
</Grid>
|
||||
</Window>
|
||||
106
Hardcodet.NotifyIcon.Wpf/Source/Sample Project/Main.xaml.cs
Normal file
@@ -0,0 +1,106 @@
|
||||
using System.Diagnostics;
|
||||
using System.Windows;
|
||||
using Samples.Tutorials;
|
||||
using Samples.Tutorials.Balloons;
|
||||
using Samples.Tutorials.Commands;
|
||||
using Samples.Tutorials.ContextMenus;
|
||||
using Samples.Tutorials.DataBinding;
|
||||
using Samples.Tutorials.Events;
|
||||
using Samples.Tutorials.MvvmSample;
|
||||
using Samples.Tutorials.Popups;
|
||||
using Samples.Tutorials.ToolTips;
|
||||
|
||||
namespace Samples
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for Main.xaml
|
||||
/// </summary>
|
||||
public partial class Main : Window
|
||||
{
|
||||
public Main()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Sets <see cref="Window.WindowStartupLocation"/> and
|
||||
/// <see cref="Window.Owner"/> properties of a dialog that
|
||||
/// is about to be displayed.
|
||||
/// </summary>
|
||||
/// <param name="window">The processed window.</param>
|
||||
private void ShowDialog(Window window)
|
||||
{
|
||||
window.Owner = this;
|
||||
window.WindowStartupLocation = WindowStartupLocation.CenterOwner;
|
||||
window.ShowDialog();
|
||||
}
|
||||
|
||||
private void btnDeclaration_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ShowDialog(new SimpleWindowWithNotifyIcon());
|
||||
}
|
||||
|
||||
|
||||
private void btnInlineToolTip_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ShowDialog(new InlineToolTipWindow());
|
||||
}
|
||||
|
||||
private void btnToolTipControl_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ShowDialog(new UserControlToolTipWindow());
|
||||
}
|
||||
|
||||
private void btnPopups_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ShowDialog(new InlinePopupWindow());
|
||||
}
|
||||
|
||||
private void btnContextMenus_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ShowDialog(new InlineContextMenuWindow());
|
||||
}
|
||||
|
||||
private void btnBalloons_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ShowDialog(new BalloonSampleWindow());
|
||||
}
|
||||
|
||||
private void btnCommands_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ShowDialog(new CommandWindow());
|
||||
}
|
||||
|
||||
private void btnEvents_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ShowDialog(new EventVisualizerWindow());
|
||||
}
|
||||
|
||||
private void btnDataBinding_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ShowDialog(new DataBoundToolTipWindow());
|
||||
}
|
||||
|
||||
private void btnMvvm_Click(object sender, System.Windows.RoutedEventArgs e)
|
||||
{
|
||||
ShowDialog(new MvvmSampleWindow());
|
||||
}
|
||||
|
||||
private void btnMainSample_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var sampleWindow = new ShowcaseWindow();
|
||||
|
||||
sampleWindow.Owner = this;
|
||||
sampleWindow.WindowStartupLocation = WindowStartupLocation.CenterScreen;
|
||||
sampleWindow.ShowDialog();
|
||||
}
|
||||
|
||||
|
||||
private void OnNavigationRequest(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
|
||||
{
|
||||
Process.Start(e.Uri.ToString());
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
using System.Reflection;
|
||||
using System.Resources;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
|
||||
[assembly: AssemblyTitle("Sample Project")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("Microsoft")]
|
||||
[assembly: AssemblyProduct("Sample Project")]
|
||||
[assembly: AssemblyCopyright("Copyright © Microsoft 2009")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
//In order to begin building localizable applications, set
|
||||
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
|
||||
//inside a <PropertyGroup>. For example, if you are using US english
|
||||
//in your source files, set the <UICulture> to en-US. Then uncomment
|
||||
//the NeutralResourceLanguage attribute below. Update the "en-US" in
|
||||
//the line below to match the UICulture setting in the project file.
|
||||
|
||||
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
|
||||
|
||||
|
||||
[assembly: ThemeInfo(
|
||||
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
|
||||
//(used if a resource is not found in the page,
|
||||
// or application resource dictionaries)
|
||||
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
|
||||
//(used if a resource is not found in the page,
|
||||
// app, or any theme specific resource dictionaries)
|
||||
)]
|
||||
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
93
Hardcodet.NotifyIcon.Wpf/Source/Sample Project/Properties/Resources.Designer.cs
generated
Normal file
@@ -0,0 +1,93 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.18408
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace Samples.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Samples.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||
/// </summary>
|
||||
internal static System.Drawing.Icon Bulb {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("Bulb", resourceCulture);
|
||||
return ((System.Drawing.Icon)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||
/// </summary>
|
||||
internal static System.Drawing.Icon Computers {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("Computers", resourceCulture);
|
||||
return ((System.Drawing.Icon)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||
/// </summary>
|
||||
internal static System.Drawing.Icon NetDrives {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("NetDrives", resourceCulture);
|
||||
return ((System.Drawing.Icon)(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="Bulb" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\icons\bulb.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="Computers" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\icons\computers.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="NetDrives" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\icons\netdrives.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
||||
26
Hardcodet.NotifyIcon.Wpf/Source/Sample Project/Properties/Settings.Designer.cs
generated
Normal file
@@ -0,0 +1,26 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.18408
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace Samples.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
|
||||
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,355 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{71C74F29-F1C2-49C5-969F-C25AC4CDFCCC}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Samples</RootNamespace>
|
||||
<AssemblyName>Sample Project</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<OldToolsVersion>3.5</OldToolsVersion>
|
||||
<UpgradeBackupLocation />
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
<UpdateEnabled>false</UpdateEnabled>
|
||||
<UpdateMode>Foreground</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>0</ApplicationRevision>
|
||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
|
||||
<ExpressionBlendVersion>12.0.41002.1</ExpressionBlendVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Tutorials\09 - MVVM\ClockPopup.xaml.cs">
|
||||
<DependentUpon>ClockPopup.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Tutorials\09 - MVVM\MvvmSampleViewModel.cs" />
|
||||
<Compile Include="Tutorials\09 - MVVM\MvvmSampleWindow.xaml.cs">
|
||||
<DependentUpon>MvvmSampleWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Page Include="Tutorials\09 - MVVM\ClockPopup.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Tutorials\09 - MVVM\MvvmSampleWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Reference Include="PresentationFramework.Aero" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Xaml" />
|
||||
<Reference Include="System.Xml.Linq">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Data.DataSetExtensions">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="UIAutomationProvider">
|
||||
<RequiredTargetFramework>3.0</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="WindowsBase">
|
||||
<RequiredTargetFramework>3.0</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="PresentationCore">
|
||||
<RequiredTargetFramework>3.0</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="PresentationFramework">
|
||||
<RequiredTargetFramework>3.0</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Resource Include="Icons\Inactive.ico" />
|
||||
<Resource Include="Icons\Error.ico" />
|
||||
<Resource Include="Images\Info.png" />
|
||||
<Resource Include="Images\Preferences.png" />
|
||||
<Page Include="Showcase\FancyToolTip.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Showcase\NotifyIconResources.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Compile Include="Commands\CloseWindowCommand.cs" />
|
||||
<Compile Include="Showcase\FancyToolTip.xaml.cs">
|
||||
<DependentUpon>FancyToolTip.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Resource Include="Images\Logo.png" />
|
||||
<Resource Include="Tutorials\09 - MVVM\Clock.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ApplicationDefinition Include="App.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</ApplicationDefinition>
|
||||
<Page Include="Showcase\FancyBalloon.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Showcase\FancyPopup.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Main.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Tutorials\02 - ToolTips\UserControlToolTipWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Tutorials\01 - Declaration\NotifyIconResourceDictionary.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Tutorials\01 - Declaration\SimpleWindowWithNotifyIcon.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Tutorials\02 - ToolTips\SimpleUserControl.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Tutorials\02 - ToolTips\InlineToolTipWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Tutorials\03 - Popups\InlinePopupWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Tutorials\04 - ContextMenus\InlineContextMenuWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Tutorials\06 - Commands\CommandWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Tutorials\07 - Events\EventVisualizerWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Tutorials\05 - Balloons\BalloonSampleWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Tutorials\08 - DataBinding\DataBoundToolTipWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Showcase\WelcomeBalloon.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Showcase\ShowcaseWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Compile Include="App.xaml.cs">
|
||||
<SubType>Code</SubType>
|
||||
<DependentUpon>App.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Showcase\ShowcaseWindow.xaml.cs">
|
||||
<SubType>Code</SubType>
|
||||
<DependentUpon>ShowcaseWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Commands\CommandBase.cs" />
|
||||
<Compile Include="Commands\HideSampleWindowCommand.cs" />
|
||||
<Compile Include="Commands\ShowSampleWindowCommand.cs" />
|
||||
<Compile Include="Showcase\FancyBalloon.xaml.cs">
|
||||
<DependentUpon>FancyBalloon.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Showcase\FancyPopup.xaml.cs">
|
||||
<DependentUpon>FancyPopup.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Main.xaml.cs">
|
||||
<DependentUpon>Main.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\AssemblyInfo.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\Settings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Tutorials\01 - Declaration\SimpleWindowWithNotifyIcon.xaml.cs">
|
||||
<DependentUpon>SimpleWindowWithNotifyIcon.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Tutorials\02 - ToolTips\SimpleUserControl.xaml.cs">
|
||||
<DependentUpon>SimpleUserControl.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Tutorials\02 - ToolTips\InlineToolTipWindow.xaml.cs">
|
||||
<DependentUpon>InlineToolTipWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Tutorials\02 - ToolTips\UserControlToolTipWindow.xaml.cs">
|
||||
<DependentUpon>UserControlToolTipWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Tutorials\03 - Popups\InlinePopupWindow.xaml.cs">
|
||||
<DependentUpon>InlinePopupWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Tutorials\04 - ContextMenus\InlineContextMenuWindow.xaml.cs">
|
||||
<DependentUpon>InlineContextMenuWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Tutorials\06 - Commands\CommandWindow.xaml.cs">
|
||||
<DependentUpon>CommandWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Tutorials\06 - Commands\ShowMessageCommand.cs" />
|
||||
<Compile Include="Tutorials\07 - Events\EventVisualizerWindow.xaml.cs">
|
||||
<DependentUpon>EventVisualizerWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Tutorials\05 - Balloons\BalloonSampleWindow.xaml.cs">
|
||||
<DependentUpon>BalloonSampleWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Tutorials\08 - DataBinding\DataBoundToolTipWindow.xaml.cs">
|
||||
<DependentUpon>DataBoundToolTipWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Showcase\WelcomeBalloon.xaml.cs">
|
||||
<DependentUpon>WelcomeBalloon.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<AppDesigner Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Resource Include="Icons\NetDrives.ico" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Resource Include="Icons\Bulb.ico" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Resource Include="Icons\Computers.ico" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Resource Include="Images\Add.png" />
|
||||
<Resource Include="Images\Remove.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Resource Include="Images\Close.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>Windows Installer 3.1</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NotifyIconWpf\NotifyIconWpf.csproj">
|
||||
<Project>{7AC63864-7638-41C4-969C-D3197EF2BED9}</Project>
|
||||
<Name>NotifyIconWpf</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,162 @@
|
||||
<UserControl x:Class="Samples.FancyBalloon"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
x:Name="me"
|
||||
Height="120"
|
||||
Width="240">
|
||||
<UserControl.Resources>
|
||||
<Storyboard x:Key="FadeIn">
|
||||
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
|
||||
Storyboard.TargetName="grid"
|
||||
Storyboard.TargetProperty="(UIElement.Opacity)">
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:00"
|
||||
Value="0" />
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:01"
|
||||
Value="0.95" />
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:03"
|
||||
Value="0.95" />
|
||||
<!-- <SplineDoubleKeyFrame KeyTime="00:00:05" Value="0"/>-->
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
</Storyboard>
|
||||
<Storyboard x:Key="HighlightCloseButton">
|
||||
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
|
||||
Storyboard.TargetName="imgClose"
|
||||
Storyboard.TargetProperty="(UIElement.Opacity)">
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:00"
|
||||
Value="0.4" />
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000"
|
||||
Value="1" />
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
</Storyboard>
|
||||
<Storyboard x:Key="FadeCloseButton">
|
||||
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
|
||||
Storyboard.TargetName="imgClose"
|
||||
Storyboard.TargetProperty="(UIElement.Opacity)">
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:00"
|
||||
Value="1" />
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000"
|
||||
Value="0.4" />
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
</Storyboard>
|
||||
<Storyboard x:Key="FadeBack">
|
||||
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
|
||||
Storyboard.TargetName="grid"
|
||||
Storyboard.TargetProperty="(UIElement.Opacity)">
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:00"
|
||||
Value="1" />
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000"
|
||||
Value="1" />
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
</Storyboard>
|
||||
<Storyboard x:Key="FadeOut"
|
||||
Completed="OnFadeOutCompleted">
|
||||
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
|
||||
Storyboard.TargetName="grid"
|
||||
Storyboard.TargetProperty="(UIElement.Opacity)">
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:00"
|
||||
Value="1" />
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000"
|
||||
Value="0.2" />
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
</Storyboard>
|
||||
</UserControl.Resources>
|
||||
<UserControl.Triggers>
|
||||
<EventTrigger RoutedEvent="tb:TaskbarIcon.BalloonShowing">
|
||||
<BeginStoryboard Storyboard="{StaticResource FadeIn}"
|
||||
x:Name="FadeIn_BeginStoryboard" />
|
||||
</EventTrigger>
|
||||
<EventTrigger RoutedEvent="Mouse.MouseEnter"
|
||||
SourceName="imgClose">
|
||||
<BeginStoryboard Storyboard="{StaticResource HighlightCloseButton}"
|
||||
x:Name="HighlightCloseButton_BeginStoryboard" />
|
||||
</EventTrigger>
|
||||
<EventTrigger RoutedEvent="Mouse.MouseLeave"
|
||||
SourceName="imgClose">
|
||||
<BeginStoryboard Storyboard="{StaticResource FadeCloseButton}"
|
||||
x:Name="FadeCloseButton_BeginStoryboard" />
|
||||
</EventTrigger>
|
||||
<EventTrigger RoutedEvent="Mouse.MouseEnter">
|
||||
<StopStoryboard BeginStoryboardName="FadeIn_BeginStoryboard" />
|
||||
<BeginStoryboard x:Name="FadeBack_BeginStoryboard1"
|
||||
Storyboard="{StaticResource FadeBack}" />
|
||||
</EventTrigger>
|
||||
<EventTrigger RoutedEvent="tb:TaskbarIcon.BalloonClosing">
|
||||
<BeginStoryboard Storyboard="{StaticResource FadeOut}"
|
||||
x:Name="FadeOut_BeginStoryboard" />
|
||||
</EventTrigger>
|
||||
</UserControl.Triggers>
|
||||
<Grid x:Name="grid"
|
||||
MouseEnter="grid_MouseEnter">
|
||||
<Border HorizontalAlignment="Stretch"
|
||||
Margin="5,5,5,5"
|
||||
BorderThickness="1,1,1,1"
|
||||
BorderBrush="#FF997137">
|
||||
<Border.Effect>
|
||||
<DropShadowEffect Color="#FF747474" />
|
||||
</Border.Effect>
|
||||
<Border.Background>
|
||||
<LinearGradientBrush EndPoint="0.5,1"
|
||||
StartPoint="0.5,0">
|
||||
<GradientStop Color="#FF4B4B4B"
|
||||
Offset="0" />
|
||||
<GradientStop Color="#FF8F8F8F"
|
||||
Offset="1" />
|
||||
</LinearGradientBrush>
|
||||
</Border.Background>
|
||||
</Border>
|
||||
<Image HorizontalAlignment="Left"
|
||||
Margin="0,10,0,0"
|
||||
Width="72"
|
||||
Source="/Images/Info.png"
|
||||
Stretch="Fill"
|
||||
Height="72"
|
||||
VerticalAlignment="Top" />
|
||||
<TextBlock Margin="72,49.2,10,0"
|
||||
VerticalAlignment="Top"
|
||||
Foreground="#FFECAD25"
|
||||
TextWrapping="Wrap">
|
||||
<Run Text="This is a user control. The animation uses the attached " />
|
||||
<Run FontStyle="Italic"
|
||||
FontWeight="Bold"
|
||||
Text="BalloonShowing " />
|
||||
<Run Text="event." />
|
||||
</TextBlock>
|
||||
<Path Fill="#FFFFFFFF"
|
||||
Stretch="Fill"
|
||||
Margin="72,38.2,34,0"
|
||||
VerticalAlignment="Top"
|
||||
Height="1"
|
||||
Data="M26,107 L220.04123,107"
|
||||
SnapsToDevicePixels="True">
|
||||
<Path.Stroke>
|
||||
<LinearGradientBrush EndPoint="0.973,0.5"
|
||||
StartPoint="0.005,0.5">
|
||||
<GradientStop Color="#00ECAD25"
|
||||
Offset="1" />
|
||||
<GradientStop Color="#87ECAD25"
|
||||
Offset="0" />
|
||||
</LinearGradientBrush>
|
||||
</Path.Stroke>
|
||||
</Path>
|
||||
<TextBlock Margin="72,10,10,0"
|
||||
VerticalAlignment="Top"
|
||||
Height="23.2"
|
||||
Text="{Binding Path=BalloonText, ElementName=me, Mode=Default}"
|
||||
TextWrapping="Wrap"
|
||||
Foreground="#FFECAD25"
|
||||
FontWeight="Bold" />
|
||||
<Image HorizontalAlignment="Right"
|
||||
Margin="0,10,10,0"
|
||||
VerticalAlignment="Top"
|
||||
Width="16"
|
||||
Height="16"
|
||||
Source="/Images/Close.png"
|
||||
Stretch="Fill"
|
||||
Opacity="0.4"
|
||||
ToolTip="Close Balloon"
|
||||
x:Name="imgClose"
|
||||
MouseDown="imgClose_MouseDown" />
|
||||
|
||||
</Grid>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,107 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Controls.Primitives;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Animation;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
|
||||
namespace Samples
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for FancyBalloon.xaml
|
||||
/// </summary>
|
||||
public partial class FancyBalloon : UserControl
|
||||
{
|
||||
private bool isClosing = false;
|
||||
|
||||
#region BalloonText dependency property
|
||||
|
||||
/// <summary>
|
||||
/// Description
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty BalloonTextProperty =
|
||||
DependencyProperty.Register("BalloonText",
|
||||
typeof (string),
|
||||
typeof (FancyBalloon),
|
||||
new FrameworkPropertyMetadata(""));
|
||||
|
||||
/// <summary>
|
||||
/// A property wrapper for the <see cref="BalloonTextProperty"/>
|
||||
/// dependency property:<br/>
|
||||
/// Description
|
||||
/// </summary>
|
||||
public string BalloonText
|
||||
{
|
||||
get { return (string) GetValue(BalloonTextProperty); }
|
||||
set { SetValue(BalloonTextProperty, value); }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public FancyBalloon()
|
||||
{
|
||||
InitializeComponent();
|
||||
TaskbarIcon.AddBalloonClosingHandler(this, OnBalloonClosing);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// By subscribing to the <see cref="TaskbarIcon.BalloonClosingEvent"/>
|
||||
/// and setting the "Handled" property to true, we suppress the popup
|
||||
/// from being closed in order to display the custom fade-out animation.
|
||||
/// </summary>
|
||||
private void OnBalloonClosing(object sender, RoutedEventArgs e)
|
||||
{
|
||||
e.Handled = true; //suppresses the popup from being closed immediately
|
||||
isClosing = true;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Resolves the <see cref="TaskbarIcon"/> that displayed
|
||||
/// the balloon and requests a close action.
|
||||
/// </summary>
|
||||
private void imgClose_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
//the tray icon assigned this attached property to simplify access
|
||||
TaskbarIcon taskbarIcon = TaskbarIcon.GetParentTaskbarIcon(this);
|
||||
taskbarIcon.CloseBalloon();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// If the users hovers over the balloon, we don't close it.
|
||||
/// </summary>
|
||||
private void grid_MouseEnter(object sender, MouseEventArgs e)
|
||||
{
|
||||
//if we're already running the fade-out animation, do not interrupt anymore
|
||||
//(makes things too complicated for the sample)
|
||||
if (isClosing) return;
|
||||
|
||||
//the tray icon assigned this attached property to simplify access
|
||||
TaskbarIcon taskbarIcon = TaskbarIcon.GetParentTaskbarIcon(this);
|
||||
taskbarIcon.ResetBalloonCloseTimer();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Closes the popup once the fade-out animation completed.
|
||||
/// The animation was triggered in XAML through the attached
|
||||
/// BalloonClosing event.
|
||||
/// </summary>
|
||||
private void OnFadeOutCompleted(object sender, EventArgs e)
|
||||
{
|
||||
Popup pp = (Popup) Parent;
|
||||
pp.IsOpen = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
<UserControl
|
||||
x:Class="Samples.FancyPopup"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
Height="215"
|
||||
Width="300" x:Name="me">
|
||||
<UserControl.Resources>
|
||||
<Storyboard x:Key="RotateIcon">
|
||||
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="image" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)">
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
|
||||
<SplineDoubleKeyFrame KeySpline="0,0.284,0.39,1" KeyTime="00:00:01.4000000" Value="360"/>
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
</Storyboard>
|
||||
</UserControl.Resources>
|
||||
<UserControl.Triggers>
|
||||
<EventTrigger RoutedEvent="tb:TaskbarIcon.PopupOpened">
|
||||
<BeginStoryboard Storyboard="{StaticResource RotateIcon}" x:Name="RotateIcon_BeginStoryboard"/>
|
||||
</EventTrigger>
|
||||
</UserControl.Triggers>
|
||||
<Grid>
|
||||
<Border
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Stretch"
|
||||
Width="Auto"
|
||||
Height="Auto"
|
||||
Margin="5,5,5,5"
|
||||
CornerRadius="10,10,10,10">
|
||||
<Border.Effect>
|
||||
<DropShadowEffect
|
||||
Color="#FF474747" />
|
||||
</Border.Effect>
|
||||
<Border.Background>
|
||||
<LinearGradientBrush
|
||||
EndPoint="0.5,1"
|
||||
StartPoint="0.5,0">
|
||||
<GradientStop
|
||||
Color="#FF58C2FF"
|
||||
Offset="0" />
|
||||
<GradientStop
|
||||
Color="#FFFFFFFF"
|
||||
Offset="1" />
|
||||
</LinearGradientBrush>
|
||||
</Border.Background>
|
||||
</Border>
|
||||
<Image
|
||||
HorizontalAlignment="Left"
|
||||
Margin="19,10,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Width="72"
|
||||
Height="72"
|
||||
Source="/Images/Preferences.png"
|
||||
Stretch="Fill" x:Name="image" RenderTransformOrigin="0.5,0.5" >
|
||||
<Image.RenderTransform>
|
||||
<TransformGroup>
|
||||
<ScaleTransform ScaleX="1" ScaleY="1"/>
|
||||
<SkewTransform AngleX="0" AngleY="0"/>
|
||||
<RotateTransform Angle="0"/>
|
||||
<TranslateTransform X="0" Y="0"/>
|
||||
</TransformGroup>
|
||||
</Image.RenderTransform>
|
||||
</Image>
|
||||
<TextBlock
|
||||
Margin="107,10,20,0"
|
||||
TextWrapping="Wrap"
|
||||
Height="Auto"
|
||||
VerticalAlignment="Top"
|
||||
FontSize="16"
|
||||
FontWeight="Bold"
|
||||
Foreground="#FF575757" HorizontalAlignment="Right"><Run
|
||||
Text="This is a fancy Popup..."
|
||||
Language="de-ch" /></TextBlock>
|
||||
<Button
|
||||
Click="OnButtonClick"
|
||||
ToolTip="{Binding Path=ToolTipText}"
|
||||
HorizontalAlignment="Right"
|
||||
VerticalAlignment="Bottom"
|
||||
Width="89"
|
||||
Height="29"
|
||||
Content="Click me"
|
||||
Margin="0,0,20,20"
|
||||
BorderBrush="#FFFFFFFF">
|
||||
<Button.Background>
|
||||
<LinearGradientBrush
|
||||
EndPoint="0,1"
|
||||
StartPoint="0,0">
|
||||
<GradientStop
|
||||
Color="#FFFFFFFF"
|
||||
Offset="1" />
|
||||
<GradientStop
|
||||
Color="#FFFFD197"
|
||||
Offset="0.459" />
|
||||
<GradientStop
|
||||
Color="#FFFFDBAD"
|
||||
Offset="0" />
|
||||
<GradientStop
|
||||
Color="#FFF18E23"
|
||||
Offset="0.508" />
|
||||
<GradientStop
|
||||
Color="#FFF9D4AC"
|
||||
Offset="0.954" />
|
||||
</LinearGradientBrush>
|
||||
</Button.Background>
|
||||
</Button>
|
||||
<TextBlock
|
||||
Margin="19,92,10,49"
|
||||
TextWrapping="Wrap"><Run Text="This user control makes use of the " Language="de-ch"/><Run FontStyle="Italic" FontWeight="Bold" Text="PopupOpened " Language="de-ch"/><Run Text="attached routed event . Whenever the popup is opened, this attached event fires and triggers the rotation animation." Language="de-ch"/></TextBlock>
|
||||
<TextBlock Margin="0,52,20,0" VerticalAlignment="Top" Height="Auto" TextWrapping="Wrap" FontWeight="Bold" FontSize="14" HorizontalAlignment="Right" Foreground="#FF575757"><Run Text="Clicks: " Language="de-ch"/><InlineUIContainer>
|
||||
<TextBlock Width="Auto" Height="Auto" Text="{Binding Path=ClickCount, ElementName=me, Mode=Default}" TextWrapping="Wrap"/>
|
||||
</InlineUIContainer></TextBlock>
|
||||
<Image
|
||||
Source="{Binding Path=IconSource}" Width="16" HorizontalAlignment="Left" Margin="19,0,0,23" Height="16" VerticalAlignment="Bottom" />
|
||||
|
||||
</Grid>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,46 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace Samples
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for FancyPopup.xaml
|
||||
/// </summary>
|
||||
public partial class FancyPopup : UserControl
|
||||
{
|
||||
#region ClickCount dependency property
|
||||
|
||||
/// <summary>
|
||||
/// The number of clicks on the popup button.
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty ClickCountProperty =
|
||||
DependencyProperty.Register("ClickCount",
|
||||
typeof (int),
|
||||
typeof (FancyPopup),
|
||||
new FrameworkPropertyMetadata(0));
|
||||
|
||||
/// <summary>
|
||||
/// A property wrapper for the <see cref="ClickCountProperty"/>
|
||||
/// dependency property:<br/>
|
||||
/// The number of clicks on the popup button.
|
||||
/// </summary>
|
||||
public int ClickCount
|
||||
{
|
||||
get { return (int) GetValue(ClickCountProperty); }
|
||||
set { SetValue(ClickCountProperty, value); }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public FancyPopup()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void OnButtonClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
//just increment a counter - will be displayed on screen
|
||||
ClickCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
<UserControl
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
mc:Ignorable="d"
|
||||
x:Class="Samples.FancyToolTip"
|
||||
x:Name="me"
|
||||
Width="285"
|
||||
Height="136">
|
||||
<UserControl.Resources>
|
||||
<Storyboard x:Key="FadeIn">
|
||||
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="border" Storyboard.TargetProperty="(UIElement.Opacity)">
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:01" Value="1" KeySpline="0,0,0.46,0.969"/>
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="image" Storyboard.TargetProperty="(UIElement.Opacity)">
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0.6"/>
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:01" Value="1"/>
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
</Storyboard>
|
||||
<Storyboard x:Key="FadeOut">
|
||||
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="border" Storyboard.TargetProperty="(UIElement.Opacity)">
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="1"/>
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:01" Value="0.25"/>
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="image" Storyboard.TargetProperty="(UIElement.Opacity)">
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="1"/>
|
||||
<SplineDoubleKeyFrame KeyTime="00:00:01" Value="0.6"/>
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
</Storyboard>
|
||||
</UserControl.Resources>
|
||||
<UserControl.Triggers>
|
||||
<EventTrigger RoutedEvent="tb:TaskbarIcon.ToolTipOpened">
|
||||
<BeginStoryboard Storyboard="{StaticResource FadeIn}" x:Name="FadeIn_BeginStoryboard"/>
|
||||
</EventTrigger>
|
||||
<EventTrigger RoutedEvent="tb:TaskbarIcon.ToolTipClose">
|
||||
<BeginStoryboard Storyboard="{StaticResource FadeOut}" x:Name="FadeOut_BeginStoryboard"/>
|
||||
</EventTrigger>
|
||||
</UserControl.Triggers>
|
||||
|
||||
<Grid
|
||||
x:Name="LayoutRoot" Height="Auto">
|
||||
<Border
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Stretch"
|
||||
Width="Auto"
|
||||
Height="Auto"
|
||||
CornerRadius="6,6,6,6"
|
||||
BorderThickness="3,3,3,3"
|
||||
Margin="0,0,5,5" x:Name="border">
|
||||
<Border.Effect>
|
||||
<DropShadowEffect
|
||||
Color="#FF7A7A7A" />
|
||||
</Border.Effect>
|
||||
<Border.Background>
|
||||
<LinearGradientBrush
|
||||
EndPoint="0.5,1"
|
||||
StartPoint="0.5,0">
|
||||
<GradientStop
|
||||
Color="#FFFFD283"
|
||||
Offset="0" />
|
||||
<GradientStop
|
||||
Color="#FFFFFFFF"
|
||||
Offset="1" />
|
||||
</LinearGradientBrush>
|
||||
</Border.Background>
|
||||
</Border>
|
||||
<Image
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,10,0,26"
|
||||
Width="72"
|
||||
Source="/Images/Info.png"
|
||||
Stretch="Fill"
|
||||
VerticalAlignment="Top"
|
||||
RenderTransformOrigin="0.792,0.486" x:Name="image" Height="72" >
|
||||
<Image.RenderTransform>
|
||||
<TransformGroup>
|
||||
<ScaleTransform ScaleX="1" ScaleY="1"/>
|
||||
<SkewTransform AngleX="0" AngleY="0"/>
|
||||
<RotateTransform Angle="0"/>
|
||||
<TranslateTransform X="0" Y="0"/>
|
||||
</TransformGroup>
|
||||
</Image.RenderTransform>
|
||||
</Image>
|
||||
<TextBlock
|
||||
Margin="82,10,20,0"
|
||||
TextWrapping="Wrap"
|
||||
Height="32"
|
||||
VerticalAlignment="Top"
|
||||
FontSize="16"
|
||||
FontWeight="Bold"
|
||||
Foreground="#FF575757"><Run
|
||||
Text="This is a fancy ToolTip..."
|
||||
Language="de-ch" /></TextBlock>
|
||||
<TextBlock
|
||||
FontSize="12"
|
||||
FontWeight="Bold"
|
||||
Foreground="#FF141414"
|
||||
TextWrapping="Wrap"
|
||||
Margin="10,0,20,19"
|
||||
VerticalAlignment="Bottom"
|
||||
Text="{Binding ElementName=me, Path=InfoText}"
|
||||
x:Name="txtToolTipDetail" d:LayoutOverrides="Height" />
|
||||
<TextBlock
|
||||
FontSize="12"
|
||||
FontWeight="Normal"
|
||||
Foreground="#FF141414"
|
||||
TextWrapping="Wrap"
|
||||
Margin="82,42,20,44.96"
|
||||
x:Name="txtToolTipDetail_Copy" ><Run Text="Data binding is simple: The NotifyIcon sets the DataContext unless it's not already in use." Language="de-ch"/></TextBlock>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,51 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
|
||||
namespace Samples
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for FancyToolTip.xaml
|
||||
/// </summary>
|
||||
public partial class FancyToolTip
|
||||
{
|
||||
#region InfoText dependency property
|
||||
|
||||
/// <summary>
|
||||
/// The tooltip details.
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty InfoTextProperty =
|
||||
DependencyProperty.Register("InfoText",
|
||||
typeof (string),
|
||||
typeof (FancyToolTip),
|
||||
new FrameworkPropertyMetadata(""));
|
||||
|
||||
/// <summary>
|
||||
/// A property wrapper for the <see cref="InfoTextProperty"/>
|
||||
/// dependency property:<br/>
|
||||
/// The tooltip details.
|
||||
/// </summary>
|
||||
public string InfoText
|
||||
{
|
||||
get { return (string) GetValue(InfoTextProperty); }
|
||||
set { SetValue(InfoTextProperty, value); }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public FancyToolTip()
|
||||
{
|
||||
this.InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:Commands="clr-namespace:Samples.Commands"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar">
|
||||
<LinearGradientBrush x:Key="MenuBackground"
|
||||
EndPoint="0.5,1"
|
||||
StartPoint="0.5,0">
|
||||
<GradientStop Color="#FFFFD892"
|
||||
Offset="1" />
|
||||
<GradientStop Color="#FFFFF3DD"
|
||||
Offset="0.259" />
|
||||
</LinearGradientBrush>
|
||||
|
||||
|
||||
<Style TargetType="{x:Type ContextMenu}">
|
||||
<Setter Property="BorderThickness"
|
||||
Value="1,1,1,1" />
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="{x:Type ContextMenu}">
|
||||
<Grid>
|
||||
<Border Background="{DynamicResource MenuBackground}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}">
|
||||
<ScrollViewer
|
||||
Style="{DynamicResource {ComponentResourceKey ResourceId=MenuScrollViewer, TypeInTargetAssembly={x:Type FrameworkElement}}}"
|
||||
Uid="ScrollViewer_9"
|
||||
CanContentScroll="True">
|
||||
<ItemsPresenter Margin="{TemplateBinding Padding}"
|
||||
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
|
||||
KeyboardNavigation.DirectionalNavigation="Cycle" />
|
||||
</ScrollViewer>
|
||||
</Border>
|
||||
</Grid>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
|
||||
<!-- The taskbar context menu - the first row is a dummy to show off simple data binding -->
|
||||
<!--
|
||||
The "shared" directive is needed if we reopen the sample window a few times - WPF will otherwise
|
||||
reuse the same context menu (which is a resource) again (which will have its DataContext set to the old TaskbarIcon)
|
||||
-->
|
||||
<ContextMenu x:Shared="false"
|
||||
x:Key="tbMenu">
|
||||
<MenuItem IsEnabled="False"
|
||||
Header="{Binding Path=ToolTipText}">
|
||||
<MenuItem.Icon>
|
||||
<Image Width="16"
|
||||
Height="16"
|
||||
Source="{Binding Path=IconSource}" />
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
|
||||
<MenuItem Header="Show Showcase Window"
|
||||
Command="{Commands:ShowSampleWindowCommand}"
|
||||
CommandParameter="{Binding}">
|
||||
<MenuItem.Icon>
|
||||
<Image Width="16"
|
||||
Height="16"
|
||||
Source="/Images/Add.png" />
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
|
||||
<Separator />
|
||||
|
||||
<MenuItem Header="Hide Showcase Window"
|
||||
Command="{Commands:HideSampleWindowCommand}"
|
||||
CommandParameter="{Binding}">
|
||||
<MenuItem.Icon>
|
||||
<Image Width="16"
|
||||
Height="16"
|
||||
Source="/Images/Remove.png" />
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
</ContextMenu>
|
||||
|
||||
|
||||
</ResourceDictionary>
|
||||
@@ -0,0 +1,640 @@
|
||||
<Window
|
||||
x:Class="Samples.ShowcaseWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
xmlns:sys="clr-namespace:System;assembly=mscorlib"
|
||||
Title="WPF NotifyIcon"
|
||||
Height="874"
|
||||
Width="936.387"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d"
|
||||
xmlns:local="clr-namespace:Samples"
|
||||
xmlns:Commands="clr-namespace:Samples.Commands"
|
||||
MinWidth="750"
|
||||
MinHeight="800"
|
||||
ResizeMode="NoResize">
|
||||
<Window.Resources>
|
||||
|
||||
<BooleanToVisibilityConverter
|
||||
x:Key="BooleanToVisibilityConverter" />
|
||||
|
||||
<ObjectDataProvider
|
||||
MethodName="GetValues"
|
||||
ObjectType="{x:Type sys:Enum}"
|
||||
x:Key="ActivationModes">
|
||||
<ObjectDataProvider.MethodParameters>
|
||||
<x:Type
|
||||
TypeName="tb:PopupActivationMode" />
|
||||
</ObjectDataProvider.MethodParameters>
|
||||
</ObjectDataProvider>
|
||||
|
||||
</Window.Resources>
|
||||
<Window.Background>
|
||||
<LinearGradientBrush
|
||||
EndPoint="0.771,0.907"
|
||||
StartPoint="0.229,0.093">
|
||||
<GradientStop
|
||||
Color="#FFFFFFFF"
|
||||
Offset="1" />
|
||||
<GradientStop
|
||||
Color="#FFDAE9FF" />
|
||||
</LinearGradientBrush>
|
||||
</Window.Background>
|
||||
<Window.Triggers>
|
||||
<EventTrigger
|
||||
RoutedEvent="tb:TaskbarIcon.TrayToolTipOpen"
|
||||
SourceName="tb" />
|
||||
</Window.Triggers>
|
||||
|
||||
<Grid
|
||||
Hyperlink.RequestNavigate="OnNavigationRequest">
|
||||
|
||||
|
||||
<!--
|
||||
THE TASKBARICON ELEMENT WAS DECLARED INLINE IN ORDER TO USE DATABINDING
|
||||
FOR ITS PROPERTIES. IN A REAL-LIFE APP, YOU'D PROBABLY RATHER DECLARE
|
||||
IT IN A RESOURCE DICTIONARY SO YOU CAN ALSO USE IT IF THERE IS NO WINDOW
|
||||
OPEN.
|
||||
-->
|
||||
|
||||
<tb:TaskbarIcon
|
||||
x:Name="tb"
|
||||
VerticalAlignment="Top"
|
||||
IconSource="{Binding Path=SelectedItem.Source, ElementName=iconList, Mode=Default}"
|
||||
ContextMenu="{StaticResource tbMenu}"
|
||||
ToolTipText="{Binding Path=Text, ElementName=txtToolTipText, Mode=Default}"
|
||||
Visibility="{Binding Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}, ElementName=iconVisibility, Mode=Default}"
|
||||
MenuActivation="{Binding Path=SelectedItem, ElementName=lstMenuTrigger, Mode=Default}"
|
||||
PopupActivation="{Binding Path=SelectedItem, ElementName=lstPopupTrigger, Mode=Default}"
|
||||
DoubleClickCommand="{Commands:ShowSampleWindowCommand}"
|
||||
DoubleClickCommandParameter="{Binding RelativeSource={RelativeSource Self}}">
|
||||
|
||||
<tb:TaskbarIcon.TrayPopup>
|
||||
<!-- the control will be put into a popup with an explicit DataContext -->
|
||||
<local:FancyPopup />
|
||||
</tb:TaskbarIcon.TrayPopup>
|
||||
|
||||
<tb:TaskbarIcon.TrayToolTip>
|
||||
<!-- the control will be put into a tooltip with an explicit DataContext -->
|
||||
<local:FancyToolTip
|
||||
Opacity="0.85"
|
||||
InfoText="{Binding Path=ToolTipText}" />
|
||||
</tb:TaskbarIcon.TrayToolTip>
|
||||
|
||||
</tb:TaskbarIcon>
|
||||
|
||||
|
||||
<!-- ************************************************************************************* -->
|
||||
<!-- ************************************************************************************* -->
|
||||
<!-- EVERYTHING BELOW IS JUST PLUMBING FOR THE SAMPLE -->
|
||||
|
||||
|
||||
<Grid
|
||||
Margin="509.567,578.58,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Height="248"
|
||||
x:Name="Balloons"
|
||||
Width="405.32"
|
||||
HorizontalAlignment="Left">
|
||||
<Border
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Stretch"
|
||||
BorderBrush="Black"
|
||||
BorderThickness="2,2,2,2" />
|
||||
<TextBox
|
||||
Margin="125,0,17,133"
|
||||
x:Name="txtBalloonTitle"
|
||||
VerticalAlignment="Bottom"
|
||||
Height="23">
|
||||
WPF NotifyIcon
|
||||
</TextBox>
|
||||
<TextBox
|
||||
Margin="125,0,17,76"
|
||||
x:Name="txtBalloonText"
|
||||
AcceptsReturn="True"
|
||||
Height="47"
|
||||
VerticalAlignment="Bottom"
|
||||
d:LayoutOverrides="VerticalAlignment"
|
||||
TextWrapping="Wrap"
|
||||
Text="You should see a LED icon in your system tray. This is your NotifyIcon." />
|
||||
<RadioButton
|
||||
HorizontalAlignment="Left"
|
||||
Margin="14,0,0,54"
|
||||
VerticalAlignment="Bottom"
|
||||
Width="111"
|
||||
Height="22"
|
||||
Content="Show as Info"
|
||||
IsChecked="True"
|
||||
x:Name="rbInfo" />
|
||||
<TextBlock
|
||||
HorizontalAlignment="Left"
|
||||
Margin="14,0,0,133"
|
||||
VerticalAlignment="Bottom"
|
||||
Width="85"
|
||||
Height="23"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Text="Balloon Title" />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
Margin="14,0,0,100"
|
||||
TextWrapping="Wrap"
|
||||
HorizontalAlignment="Left"
|
||||
Width="85"
|
||||
Height="23"
|
||||
VerticalAlignment="Bottom"
|
||||
d:LayoutOverrides="VerticalAlignment">
|
||||
<Run
|
||||
Text="Balloon Text" />
|
||||
</TextBlock>
|
||||
<RadioButton
|
||||
Margin="14,0,0,32"
|
||||
VerticalAlignment="Bottom"
|
||||
Height="22"
|
||||
Content="Show as Error"
|
||||
HorizontalAlignment="Left"
|
||||
Width="111"
|
||||
x:Name="rbError" />
|
||||
<RadioButton
|
||||
Margin="14,0,0,10"
|
||||
VerticalAlignment="Bottom"
|
||||
Height="22"
|
||||
Content="Show Custom Icon"
|
||||
HorizontalAlignment="Left"
|
||||
Width="130"
|
||||
x:Name="rbCustomIcon" />
|
||||
<Button
|
||||
HorizontalAlignment="Right"
|
||||
Margin="0,0,17,43"
|
||||
x:Name="showBalloonTip"
|
||||
Width="120"
|
||||
Content="Show Balloon Tip"
|
||||
VerticalAlignment="Bottom"
|
||||
Height="23"
|
||||
Click="showBalloonTip_Click" />
|
||||
<TextBlock
|
||||
Margin="10,35.96,21,0"
|
||||
VerticalAlignment="Top"
|
||||
Height="56.04"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Text="Displays default balloon tips as supported by the OS. " />
|
||||
<Run
|
||||
Text="You can use custom icons under all OS versions" />
|
||||
<Run
|
||||
Text=" (not supported by WinForms NotifyIcon)." />
|
||||
<Run
|
||||
Text="." />
|
||||
</TextBlock>
|
||||
<Button
|
||||
HorizontalAlignment="Right"
|
||||
Margin="0,0,17,12.52"
|
||||
x:Name="hideBalloonTip"
|
||||
Width="120"
|
||||
Content="Hide Balloon Tip"
|
||||
VerticalAlignment="Bottom"
|
||||
Height="23"
|
||||
Click="hideBalloonTip_Click" />
|
||||
<TextBlock
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,10,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Width="Auto"
|
||||
Height="Auto"
|
||||
FontWeight="Bold"
|
||||
TextDecorations="Underline"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Text="Standard (OS) Balloon Tips" />
|
||||
</TextBlock>
|
||||
</Grid>
|
||||
<Grid
|
||||
HorizontalAlignment="Left"
|
||||
Margin="12,543.88,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Width="469.5"
|
||||
Height="282.7"
|
||||
x:Name="Popups">
|
||||
<Border
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Stretch"
|
||||
BorderBrush="#FF000000"
|
||||
BorderThickness="2,2,2,2" />
|
||||
<ListBox
|
||||
IsSynchronizedWithCurrentItem="False"
|
||||
x:Name="lstPopupTrigger"
|
||||
ItemsSource="{Binding Mode=OneWay, Source={StaticResource ActivationModes}}"
|
||||
Margin="10,0,190,10"
|
||||
SelectedIndex="0"
|
||||
Height="117"
|
||||
VerticalAlignment="Bottom" />
|
||||
<TextBlock
|
||||
Margin="10,31.7,14,137"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Text="If the user clicks on the " />
|
||||
<Run
|
||||
Text="Notify" />
|
||||
<Run
|
||||
Text="Icon, a " />
|
||||
<Run
|
||||
Text="P" />
|
||||
<Run
|
||||
Text="opup can be opened and displayed" />
|
||||
<Run
|
||||
Text=" that allows the user to quickly interact with the application" />
|
||||
<Run
|
||||
Text=". " />
|
||||
<Run
|
||||
Text="Unlike custom ToolTips, this works under all OS versions" />
|
||||
<Run
|
||||
Text=". " />
|
||||
<Run
|
||||
Text="Which mouse button(s) opens the Popup is " />
|
||||
<Run
|
||||
Text="determined by the " />
|
||||
<Run
|
||||
FontStyle="Italic"
|
||||
FontWeight="Bold"
|
||||
Text="PopupActivation " />
|
||||
<Run
|
||||
Text="property." />
|
||||
<Run
|
||||
Text=" If both Popup and ContextMenu are configured for the same mouse buttons, ContextMenu takes precedence." />
|
||||
<LineBreak />
|
||||
<Run
|
||||
Text="(Note: " />
|
||||
<Run
|
||||
Text="In case left-clicks are used, popups are displayed with a delay to ensure the user does not double-click." />
|
||||
<Run
|
||||
Text=")" />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,10,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Width="Auto"
|
||||
Height="Auto"
|
||||
FontWeight="Bold"
|
||||
TextDecorations="Underline"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Text="Popup Controls" />
|
||||
</TextBlock>
|
||||
</Grid>
|
||||
<Grid
|
||||
Margin="10,278,0,0"
|
||||
x:Name="ToolTips"
|
||||
Height="255.88"
|
||||
VerticalAlignment="Top"
|
||||
Width="471.5"
|
||||
HorizontalAlignment="Left">
|
||||
<Border
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Stretch"
|
||||
BorderBrush="#FF000000"
|
||||
BorderThickness="2,2,2,2" />
|
||||
<TextBox
|
||||
Margin="10,0,25,60"
|
||||
x:Name="txtToolTipText"
|
||||
VerticalAlignment="Bottom"
|
||||
Height="23"
|
||||
Text="THIS IS A SAMPLE TEXT...."
|
||||
Foreground="#FFFF0000" />
|
||||
<TextBlock
|
||||
Margin="10,0,25,93"
|
||||
TextWrapping="Wrap"
|
||||
Height="21"
|
||||
VerticalAlignment="Bottom">
|
||||
<Run
|
||||
Text="ToolTipText" />
|
||||
<Run
|
||||
Text=" (assigned to property and also used by several bindings)" />
|
||||
<Run
|
||||
Text=":" />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
Margin="10,29.88,10,114"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Text="If the user moves the mouse over the " />
|
||||
<Run
|
||||
Text="Notify" />
|
||||
<Run
|
||||
Text="Icon, " />
|
||||
<Run
|
||||
Text="a ToolTip " />
|
||||
<Run
|
||||
Text="can be displayed. Starting from Windows Vista, we have convenient events to display and hide tooltips." />
|
||||
<Run
|
||||
Text=" You can assign arbitrary UIElements (e.g. User Controls) to the " />
|
||||
<Run
|
||||
FontStyle="Italic"
|
||||
FontWeight="Bold"
|
||||
Text="TrayToolTip " />
|
||||
<Run
|
||||
Text="property." />
|
||||
<LineBreak />
|
||||
<Run
|
||||
Text="" />
|
||||
<Run
|
||||
Text="If " />
|
||||
<Run
|
||||
FontStyle="Italic"
|
||||
FontWeight="Bold"
|
||||
Text="TrayToolTip " />
|
||||
<Run
|
||||
Text="is not set or the app runs under an older OS (e.g. " />
|
||||
<Run
|
||||
Text="Windows " />
|
||||
<Run
|
||||
Text="xp), the " />
|
||||
<Run
|
||||
Text="NotifyIcon " />
|
||||
<Run
|
||||
Text="falls back to the " />
|
||||
<Run
|
||||
FontStyle="Italic"
|
||||
FontWeight="Bold"
|
||||
Text="ToolTipText " />
|
||||
<Run
|
||||
Text="property." />
|
||||
</TextBlock>
|
||||
<Button
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,0,0,10"
|
||||
VerticalAlignment="Bottom"
|
||||
Width="147"
|
||||
Height="24"
|
||||
Content="Remove Custom ToolTip"
|
||||
Name="removeToolTip"
|
||||
Click="removeToolTip_Click" />
|
||||
<TextBlock
|
||||
Margin="10,0,25,44"
|
||||
VerticalAlignment="Bottom"
|
||||
Height="16"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Text="Click to fall back to ToolTipText (sets TrayToolTip to null):" />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,10,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Width="Auto"
|
||||
Height="Auto"
|
||||
FontWeight="Bold"
|
||||
TextDecorations="Underline"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Text="ToolTips and ToolTipText" />
|
||||
</TextBlock>
|
||||
</Grid>
|
||||
<Grid
|
||||
HorizontalAlignment="Left"
|
||||
Margin="509.567,114.5,0,0"
|
||||
Width="405.32"
|
||||
x:Name="ContextMenus"
|
||||
Height="255.88"
|
||||
VerticalAlignment="Top">
|
||||
<Border
|
||||
BorderBrush="#FF000000"
|
||||
BorderThickness="2,2,2,2" />
|
||||
<ListBox
|
||||
Margin="10,0,95,10"
|
||||
IsSynchronizedWithCurrentItem="False"
|
||||
x:Name="lstMenuTrigger"
|
||||
ItemsSource="{Binding Mode=OneWay, Source={StaticResource ActivationModes}}"
|
||||
Height="124"
|
||||
VerticalAlignment="Bottom"
|
||||
SelectedIndex="1" />
|
||||
<TextBlock
|
||||
Margin="10,97,48,0"
|
||||
VerticalAlignment="Top"
|
||||
Height="22"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Text="Mouse events that open the context menu:" />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
Margin="10,30,10,0"
|
||||
VerticalAlignment="Top"
|
||||
Height="57"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Text="Assign a custon context menu through the " />
|
||||
<Run
|
||||
FontStyle="Italic"
|
||||
FontWeight="Bold"
|
||||
Text="ContextMenu " />
|
||||
<Run
|
||||
Text="property of the " />
|
||||
<Run
|
||||
Text="Notify" />
|
||||
<Run
|
||||
Text="Icon. The " />
|
||||
<Run
|
||||
FontStyle="Italic"
|
||||
FontWeight="Bold"
|
||||
Text="MenuActivation " />
|
||||
<Run
|
||||
Text="property determines what mouse events open the context menu." />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
Margin="10,10,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Height="Auto"
|
||||
TextWrapping="Wrap"
|
||||
Width="Auto"
|
||||
HorizontalAlignment="Left"
|
||||
FontWeight="Bold"
|
||||
TextDecorations="Underline">
|
||||
<Run
|
||||
Text="Context Menu" />
|
||||
</TextBlock>
|
||||
</Grid>
|
||||
<TextBlock
|
||||
Margin="10,10,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Height="Auto"
|
||||
TextWrapping="Wrap"
|
||||
FontWeight="Bold"
|
||||
FontSize="16"
|
||||
HorizontalAlignment="Left">
|
||||
<Run
|
||||
Text="WPF NotifyIcon" />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
Margin="12,57.62,15.5,0"
|
||||
VerticalAlignment="Top"
|
||||
FontSize="14"
|
||||
FontStyle="Italic"
|
||||
Foreground="#FF303030"
|
||||
TextWrapping="Wrap"
|
||||
HorizontalAlignment="Stretch">
|
||||
<Run
|
||||
Text="This " />
|
||||
<Run
|
||||
Text="is a showcase of the different features of the WPF NotifyIcon. Have a look at the used controls and styles in order to see how binding can be supported. For a real-life " />
|
||||
<Run
|
||||
Text="example" />
|
||||
<Run
|
||||
Text=", " />
|
||||
<Run
|
||||
Language="de-ch"
|
||||
Text="check out " />
|
||||
<Hyperlink
|
||||
NavigateUri="http://www.hardcodet.net/netdrives/">
|
||||
<Run
|
||||
Text="NetDrives" />
|
||||
</Hyperlink>
|
||||
</TextBlock>
|
||||
<Grid
|
||||
Margin="509.567,380.38,0,0"
|
||||
x:Name="CustomBalloons"
|
||||
Height="188.2"
|
||||
VerticalAlignment="Top"
|
||||
Width="405.32"
|
||||
HorizontalAlignment="Left">
|
||||
<Border
|
||||
HorizontalAlignment="Stretch"
|
||||
Width="Auto"
|
||||
BorderThickness="2,2,2,2"
|
||||
BorderBrush="#FF000000" />
|
||||
<Button
|
||||
Content="Show"
|
||||
x:Name="showCustomBalloon"
|
||||
Click="showCustomBalloon_Click"
|
||||
HorizontalAlignment="Right"
|
||||
Margin="0,0,91.377,10"
|
||||
Width="71.623"
|
||||
Height="23"
|
||||
VerticalAlignment="Bottom" />
|
||||
<TextBox
|
||||
VerticalAlignment="Bottom"
|
||||
Height="23"
|
||||
Text="WPF Balloon"
|
||||
TextWrapping="Wrap"
|
||||
Margin="10,0,173,10"
|
||||
x:Name="customBalloonTitle" />
|
||||
<TextBlock
|
||||
Margin="10,35,24.377,0"
|
||||
VerticalAlignment="Top"
|
||||
TextWrapping="Wrap"
|
||||
Height="119.68">
|
||||
<Run
|
||||
Text="Custom " />
|
||||
<Run
|
||||
Text="Balloons are much " />
|
||||
<Run
|
||||
Text="ore flexible then standard balloons " />
|
||||
<Run
|
||||
Text="tips " />
|
||||
<Run
|
||||
Text="when it comes to styling." />
|
||||
<Run
|
||||
Text=" You can display arbitrary UI Elements (e.g. User Controls) as custom balloons." />
|
||||
<LineBreak />
|
||||
<Run
|
||||
Text="Apart from the richer UI, custom balloons also provide a" />
|
||||
<Run
|
||||
Text="ttached properties and events that can be used to control behavior." />
|
||||
<Run
|
||||
Text=" Custom balloons also work if the NotifyIcon is not visible." />
|
||||
<LineBreak />
|
||||
<Run
|
||||
Text="(Hint: Hover over the " />
|
||||
<Run
|
||||
Text="balloon " />
|
||||
<Run
|
||||
Text="to suspend the fade-out.)" />
|
||||
</TextBlock>
|
||||
<Button
|
||||
Content="Close"
|
||||
x:Name="hideCustomBalloon"
|
||||
Click="hideCustomBalloon_Click"
|
||||
HorizontalAlignment="Right"
|
||||
Margin="0,0,9.754,10.52"
|
||||
Width="71.623"
|
||||
Height="23"
|
||||
VerticalAlignment="Bottom" />
|
||||
<TextBlock
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,10,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Width="Auto"
|
||||
Height="Auto"
|
||||
FontWeight="Bold"
|
||||
TextDecorations="Underline"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Text="Custom Balloons" />
|
||||
</TextBlock>
|
||||
</Grid>
|
||||
<Grid
|
||||
Margin="10,114.5,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Height="147.351"
|
||||
x:Name="Common"
|
||||
Width="471.5"
|
||||
HorizontalAlignment="Left">
|
||||
<Border
|
||||
BorderThickness="2,2,2,2"
|
||||
BorderBrush="#FF000000"
|
||||
d:IsLocked="True" />
|
||||
<CheckBox
|
||||
Margin="10,35.96,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Content="NotifyIcon Visible"
|
||||
x:Name="iconVisibility"
|
||||
IsChecked="True"
|
||||
HorizontalAlignment="Left"
|
||||
Width="155.42"
|
||||
d:LayoutOverrides="Height" />
|
||||
<ListBox
|
||||
Margin="10,77.38,0,0"
|
||||
IsSynchronizedWithCurrentItem="True"
|
||||
x:Name="iconList"
|
||||
SelectedIndex="0"
|
||||
Width="123"
|
||||
HorizontalAlignment="Left"
|
||||
Height="59.971"
|
||||
VerticalAlignment="Top" ScrollViewer.VerticalScrollBarVisibility="Auto">
|
||||
<Image
|
||||
Width="16"
|
||||
Margin="0,4,0,0"
|
||||
Height="16"
|
||||
Source="/Icons/Inactive.ico" />
|
||||
<Image
|
||||
Width="16"
|
||||
Margin="0,4,0,0"
|
||||
Height="16"
|
||||
Source="/Icons/Error.ico" />
|
||||
|
||||
</ListBox>
|
||||
<TextBlock
|
||||
Margin="10,55.38,0,61"
|
||||
Width="Auto"
|
||||
TextWrapping="Wrap"
|
||||
d:LayoutOverrides="Width"
|
||||
HorizontalAlignment="Left">
|
||||
<Run
|
||||
Text="Select an image to switch icons:" />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
HorizontalAlignment="Left"
|
||||
Margin="10,10,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Width="Auto"
|
||||
Height="Auto"
|
||||
FontWeight="Bold"
|
||||
TextDecorations="Underline"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Text="Icon / Visibility" />
|
||||
</TextBlock>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,92 @@
|
||||
using System.Diagnostics;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls.Primitives;
|
||||
using System.Windows.Navigation;
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
|
||||
namespace Samples
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for ShowcaseWindow.xaml
|
||||
/// </summary>
|
||||
public partial class ShowcaseWindow : Window
|
||||
{
|
||||
public ShowcaseWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
|
||||
Loaded += delegate
|
||||
{
|
||||
//show balloon at startup
|
||||
var balloon = new WelcomeBalloon();
|
||||
tb.ShowCustomBalloon(balloon, PopupAnimation.Slide, 12000);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Displays a balloon tip.
|
||||
/// </summary>
|
||||
private void showBalloonTip_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string title = txtBalloonTitle.Text;
|
||||
string message = txtBalloonText.Text;
|
||||
|
||||
if (rbCustomIcon.IsChecked == true)
|
||||
{
|
||||
//just display the icon on the tray
|
||||
var icon = tb.Icon;
|
||||
tb.ShowBalloonTip(title, message, icon);
|
||||
}
|
||||
else
|
||||
{
|
||||
BalloonIcon bi = rbInfo.IsChecked == true ? BalloonIcon.Info : BalloonIcon.Error;
|
||||
tb.ShowBalloonTip(title, message, bi);
|
||||
}
|
||||
}
|
||||
|
||||
private void hideBalloonTip_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
tb.HideBalloonTip();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Resets the tooltip.
|
||||
/// </summary>
|
||||
private void removeToolTip_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
tb.TrayToolTip = null;
|
||||
}
|
||||
|
||||
|
||||
private void showCustomBalloon_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
FancyBalloon balloon = new FancyBalloon();
|
||||
balloon.BalloonText = customBalloonTitle.Text;
|
||||
//show and close after 2.5 seconds
|
||||
tb.ShowCustomBalloon(balloon, PopupAnimation.Slide, 5000);
|
||||
}
|
||||
|
||||
private void hideCustomBalloon_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
tb.CloseBalloon();
|
||||
}
|
||||
|
||||
|
||||
private void OnNavigationRequest(object sender, RequestNavigateEventArgs e)
|
||||
{
|
||||
Process.Start(e.Uri.ToString());
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
|
||||
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
//clean up notifyicon (would otherwise stay open until application finishes)
|
||||
tb.Dispose();
|
||||
base.OnClosing(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
<UserControl
|
||||
x:Class="Samples.WelcomeBalloon"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
Height="130"
|
||||
Width="283"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d"
|
||||
x:Name="me">
|
||||
<UserControl.Resources>
|
||||
<Storyboard
|
||||
x:Key="FadeInAndOut">
|
||||
<DoubleAnimationUsingKeyFrames
|
||||
BeginTime="00:00:00"
|
||||
Storyboard.TargetName="grid"
|
||||
Storyboard.TargetProperty="(UIElement.Opacity)">
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:00"
|
||||
Value="0" />
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:01"
|
||||
Value="0.895" />
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:10"
|
||||
Value="0.895" />
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:11.6000000"
|
||||
Value="0" />
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
</Storyboard>
|
||||
</UserControl.Resources>
|
||||
<UserControl.Triggers>
|
||||
<EventTrigger
|
||||
RoutedEvent="tb:TaskbarIcon.BalloonShowing">
|
||||
<BeginStoryboard
|
||||
Storyboard="{StaticResource FadeInAndOut}"
|
||||
x:Name="FadeInAndOut_BeginStoryboard" />
|
||||
</EventTrigger>
|
||||
</UserControl.Triggers>
|
||||
<Grid
|
||||
x:Name="grid">
|
||||
|
||||
<Border
|
||||
x:Name="border"
|
||||
CornerRadius="10,10,10,10"
|
||||
Margin="0,0,5,5">
|
||||
<Border.Background>
|
||||
<LinearGradientBrush
|
||||
EndPoint="0.5,1"
|
||||
StartPoint="0.5,0">
|
||||
<GradientStop
|
||||
Color="#FFEEEEEE"
|
||||
Offset="1" />
|
||||
<GradientStop
|
||||
Color="#FFFB6B42"
|
||||
Offset="0" />
|
||||
</LinearGradientBrush>
|
||||
</Border.Background>
|
||||
<Border.Effect>
|
||||
<DropShadowEffect />
|
||||
</Border.Effect>
|
||||
</Border>
|
||||
<TextBlock
|
||||
Margin="10,10,15,0"
|
||||
VerticalAlignment="Top"
|
||||
FontSize="14"
|
||||
FontWeight="Bold"
|
||||
TextWrapping="Wrap"
|
||||
HorizontalAlignment="Center">
|
||||
<Run
|
||||
Text="WPF NotifyIcon - Sample Application"
|
||||
Language="de-ch" />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
Margin="10,38.62,10,0"
|
||||
VerticalAlignment="Top"
|
||||
TextWrapping="Wrap"
|
||||
HorizontalAlignment="Left">
|
||||
<Run
|
||||
Text="You should see this icon in your system tray:" />
|
||||
<Run
|
||||
Text=" " />
|
||||
<InlineUIContainer>
|
||||
<Image
|
||||
Source="{Binding Path=IconSource}"
|
||||
Width="16"
|
||||
Height="16" />
|
||||
</InlineUIContainer>
|
||||
<LineBreak />
|
||||
<Run
|
||||
Text="This is your NotifyIcon." />
|
||||
<LineBreak />
|
||||
<Run
|
||||
Text="" />
|
||||
<LineBreak />
|
||||
<Run
|
||||
FontSize="10"
|
||||
FontStyle="Italic"
|
||||
Text="You can change the displayed icon by selecting another image in the sample window." />
|
||||
</TextBlock>
|
||||
|
||||
</Grid>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace Samples
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for WelcomeBalloon.xaml
|
||||
/// </summary>
|
||||
public partial class WelcomeBalloon : UserControl
|
||||
{
|
||||
public WelcomeBalloon()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar">
|
||||
|
||||
<!-- Globally declared notify icon (ResourceDictionary is not in use, example only) -->
|
||||
<tb:TaskbarIcon x:Key="MyNotifyIcon"
|
||||
IconSource="/Icons/Error.ico"
|
||||
ToolTipText="hello world" />
|
||||
|
||||
</ResourceDictionary>
|
||||
@@ -0,0 +1,20 @@
|
||||
<Window
|
||||
x:Class="Samples.Tutorials.SimpleWindowWithNotifyIcon"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
Height="300"
|
||||
Width="300">
|
||||
<Grid>
|
||||
|
||||
<!-- in order to declare a NotifyIcon, all you need is the namespace declaration (see above on line 5) and a single line -->
|
||||
<tb:TaskbarIcon x:Name="MyNotifyIcon" IconSource="/Icons/Error.ico" ToolTipText="hello world" />
|
||||
|
||||
<TextBlock Margin="26,26,24,0"
|
||||
VerticalAlignment="Top"
|
||||
FontWeight="Bold"
|
||||
TextWrapping="Wrap"
|
||||
Text="You should see an icon in the tray." />
|
||||
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,23 @@
|
||||
using System.Windows;
|
||||
|
||||
namespace Samples.Tutorials
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for SimpleWindowWithNotifyIcon.xaml
|
||||
/// </summary>
|
||||
public partial class SimpleWindowWithNotifyIcon : Window
|
||||
{
|
||||
public SimpleWindowWithNotifyIcon()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
//clean up notifyicon (would otherwise stay open until application finishes)
|
||||
MyNotifyIcon.Dispose();
|
||||
|
||||
base.OnClosing(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
<Window
|
||||
x:Class="Samples.Tutorials.ToolTips.InlineToolTipWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
Height="300"
|
||||
Width="300">
|
||||
<Grid>
|
||||
|
||||
<tb:TaskbarIcon
|
||||
x:Name="MyNotifyIcon"
|
||||
IconSource="/Icons/Error.ico"
|
||||
ToolTipText="hello world">
|
||||
|
||||
<!--
|
||||
We can use arbitrary UI elements as ToolTips.
|
||||
Let's use a semi-transparent border.
|
||||
-->
|
||||
<tb:TaskbarIcon.TrayToolTip>
|
||||
<Border
|
||||
Background="White"
|
||||
BorderBrush="Orange"
|
||||
BorderThickness="2"
|
||||
CornerRadius="4"
|
||||
Opacity="0.8"
|
||||
Width="160"
|
||||
Height="40">
|
||||
<TextBlock
|
||||
Text="hello world"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center" />
|
||||
</Border>
|
||||
</tb:TaskbarIcon.TrayToolTip>
|
||||
|
||||
</tb:TaskbarIcon>
|
||||
<TextBlock Margin="26,26,24,0" VerticalAlignment="Top" FontWeight="Bold" TextWrapping="Wrap">
|
||||
<Run Text="Move mouse over NotifyIcon to show ToolTip" Language="de-ch" />
|
||||
</TextBlock>
|
||||
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace Samples.Tutorials.ToolTips
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for Window1.xaml
|
||||
/// </summary>
|
||||
public partial class InlineToolTipWindow : Window
|
||||
{
|
||||
public InlineToolTipWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
//clean up notifyicon (would otherwise stay open until application finishes)
|
||||
MyNotifyIcon.Dispose();
|
||||
|
||||
base.OnClosing(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<UserControl
|
||||
x:Class="Samples.Tutorials.ToolTips.SimpleUserControl"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
|
||||
<!-- a simple user control which displays a fixed text within a border -->
|
||||
<Border
|
||||
Background="White"
|
||||
BorderBrush="Orange"
|
||||
BorderThickness="2"
|
||||
CornerRadius="4"
|
||||
Opacity="0.8"
|
||||
Width="160"
|
||||
Height="40">
|
||||
<TextBlock
|
||||
Text="hello world"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center" />
|
||||
</Border>
|
||||
|
||||
</UserControl>
|
||||
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace Samples.Tutorials.ToolTips
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for SimpleUserControl.xaml
|
||||
/// </summary>
|
||||
public partial class SimpleUserControl : UserControl
|
||||
{
|
||||
public SimpleUserControl()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<Window
|
||||
x:Class="Samples.Tutorials.ToolTips.UserControlToolTipWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
xmlns:local="clr-namespace:Samples.Tutorials.ToolTips"
|
||||
Height="300"
|
||||
Width="300">
|
||||
<Grid>
|
||||
|
||||
<tb:TaskbarIcon
|
||||
x:Name="MyNotifyIcon"
|
||||
IconSource="/Icons/Error.ico"
|
||||
ToolTipText="hello world">
|
||||
|
||||
<!-- assign user control as ToolTip -->
|
||||
<tb:TaskbarIcon.TrayToolTip>
|
||||
<local:SimpleUserControl />
|
||||
</tb:TaskbarIcon.TrayToolTip>
|
||||
|
||||
</tb:TaskbarIcon>
|
||||
<TextBlock Margin="26,26,24,0" VerticalAlignment="Top" FontWeight="Bold" TextWrapping="Wrap">
|
||||
<Run Text="Move mouse over NotifyIcon to show ToolTip" Language="de-ch" />
|
||||
</TextBlock>
|
||||
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace Samples.Tutorials.ToolTips
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for UserControlToolTipWindow.xaml
|
||||
/// </summary>
|
||||
public partial class UserControlToolTipWindow : Window
|
||||
{
|
||||
public UserControlToolTipWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
//clean up notifyicon (would otherwise stay open until application finishes)
|
||||
MyNotifyIcon.Dispose();
|
||||
|
||||
base.OnClosing(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
<Window
|
||||
x:Class="Samples.Tutorials.Popups.InlinePopupWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
xmlns:commands="clr-namespace:Samples.Commands"
|
||||
Height="300"
|
||||
Width="300">
|
||||
<Grid>
|
||||
|
||||
<tb:TaskbarIcon
|
||||
x:Name="MyNotifyIcon"
|
||||
IconSource="/Icons/Error.ico"
|
||||
ToolTipText="hello world">
|
||||
|
||||
<!--
|
||||
We can use arbitrary UI elements as Popups.
|
||||
Popups stay open if the user moves away from the tray area
|
||||
-->
|
||||
<tb:TaskbarIcon.TrayPopup>
|
||||
<Border
|
||||
Background="White"
|
||||
BorderBrush="Orange"
|
||||
BorderThickness="2"
|
||||
CornerRadius="4"
|
||||
Width="160">
|
||||
<StackPanel>
|
||||
<TextBox
|
||||
x:Name="popupText"
|
||||
Margin="5,10,5,10"
|
||||
Width="200"
|
||||
Height="24"
|
||||
Text="Enter Text..." />
|
||||
<Button
|
||||
Content="Click Me!"
|
||||
Command="{commands:CloseWindowCommand}"
|
||||
CommandParameter="{Binding}"
|
||||
Margin="5,0,5,10"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</tb:TaskbarIcon.TrayPopup>
|
||||
|
||||
</tb:TaskbarIcon>
|
||||
<TextBlock
|
||||
Margin="26,26,24,0"
|
||||
VerticalAlignment="Top"
|
||||
FontWeight="Bold"
|
||||
Text="Left-Click NotifyIcon to open popup." />
|
||||
|
||||
<TextBlock
|
||||
Text="Text on Popup: "
|
||||
Margin="26,66,24,0"
|
||||
VerticalAlignment="Top">
|
||||
<TextBlock Foreground="Red"
|
||||
Text="{Binding ElementName=popupText, Path=Text}" />
|
||||
</TextBlock>
|
||||
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace Samples.Tutorials.Popups
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for InlinePopupWindow.xaml
|
||||
/// </summary>
|
||||
public partial class InlinePopupWindow : Window
|
||||
{
|
||||
public InlinePopupWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
//clean up notifyicon (would otherwise stay open until application finishes)
|
||||
MyNotifyIcon.Dispose();
|
||||
|
||||
base.OnClosing(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
<Window x:Class="Samples.Tutorials.ContextMenus.InlineContextMenuWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
xmlns:commands="clr-namespace:Samples.Commands"
|
||||
Height="300"
|
||||
Width="300">
|
||||
<Grid>
|
||||
|
||||
<tb:TaskbarIcon x:Name="MyNotifyIcon"
|
||||
IconSource="/Icons/Error.ico"
|
||||
ToolTipText="hello world"
|
||||
TrayContextMenuOpen="MyNotifyIcon_TrayContextMenuOpen"
|
||||
PreviewTrayContextMenuOpen="MyNotifyIcon_PreviewTrayContextMenuOpen">
|
||||
|
||||
<!-- Set a simple context menu -->
|
||||
<!-- the data context of the context menu is the NotifyIcon itself (see more about this in DataBinding samples) -->
|
||||
<tb:TaskbarIcon.ContextMenu>
|
||||
<ContextMenu>
|
||||
<TextBlock Text="Hiding the sample window will not close it!" />
|
||||
<MenuItem Header="_Show Sample Window [S]"
|
||||
Command="{commands:ShowSampleWindowCommand}"
|
||||
CommandParameter="{Binding}">
|
||||
<MenuItem.Icon>
|
||||
<Image Width="16"
|
||||
Height="16"
|
||||
Source="/Images/Add.png" />
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
|
||||
<Separator />
|
||||
|
||||
<MenuItem Header="_Hide Sample Window [H]"
|
||||
Command="{commands:HideSampleWindowCommand}"
|
||||
CommandParameter="{Binding}">
|
||||
<MenuItem.Icon>
|
||||
<Image Width="16"
|
||||
Height="16"
|
||||
Source="/Images/Remove.png" />
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
</ContextMenu>
|
||||
</tb:TaskbarIcon.ContextMenu>
|
||||
|
||||
</tb:TaskbarIcon>
|
||||
<TextBlock Margin="26,26,24,0"
|
||||
VerticalAlignment="Top"
|
||||
FontWeight="Bold"
|
||||
TextWrapping="Wrap">
|
||||
<Run Language="de-ch"
|
||||
Text="Right-click on NotifyIcon to open Context Menu" />
|
||||
</TextBlock>
|
||||
<TextBlock HorizontalAlignment="Left"
|
||||
Margin="26,83,0,0"
|
||||
TextWrapping="Wrap"
|
||||
Text="Context menu preview open events:"
|
||||
VerticalAlignment="Top" />
|
||||
<TextBlock HorizontalAlignment="Left"
|
||||
Margin="26,103.96,0,0"
|
||||
TextWrapping="Wrap"
|
||||
Text="Context menu open events:"
|
||||
VerticalAlignment="Top" />
|
||||
<TextBlock x:Name="PreviewOpenEventCounter"
|
||||
HorizontalAlignment="Left"
|
||||
Margin="246,83,0,0"
|
||||
TextWrapping="Wrap"
|
||||
Text="0"
|
||||
VerticalAlignment="Top" />
|
||||
<TextBlock x:Name="OpenEventCounter"
|
||||
HorizontalAlignment="Left"
|
||||
Margin="246,106.97,0,0"
|
||||
TextWrapping="Wrap"
|
||||
Text="0"
|
||||
VerticalAlignment="Top" />
|
||||
<CheckBox x:Name="SuppressContextMenu"
|
||||
Content="Suppress context menu in preview event"
|
||||
HorizontalAlignment="Left"
|
||||
Margin="26,190,0,0"
|
||||
VerticalAlignment="Top" />
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,40 @@
|
||||
using System.Diagnostics;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace Samples.Tutorials.ContextMenus
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for InlineContextMenuWindow.xaml
|
||||
/// </summary>
|
||||
public partial class InlineContextMenuWindow : Window
|
||||
{
|
||||
public InlineContextMenuWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
|
||||
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
//clean up notifyicon (would otherwise stay open until application finishes)
|
||||
MyNotifyIcon.Dispose();
|
||||
|
||||
base.OnClosing(e);
|
||||
}
|
||||
|
||||
private void MyNotifyIcon_TrayContextMenuOpen(object sender, System.Windows.RoutedEventArgs e)
|
||||
{
|
||||
OpenEventCounter.Text = (int.Parse(OpenEventCounter.Text) + 1).ToString();
|
||||
}
|
||||
|
||||
private void MyNotifyIcon_PreviewTrayContextMenuOpen(object sender, System.Windows.RoutedEventArgs e)
|
||||
{
|
||||
//marking the event as handled suppresses the context menu
|
||||
e.Handled = (bool) SuppressContextMenu.IsChecked;
|
||||
|
||||
PreviewOpenEventCounter.Text = (int.Parse(PreviewOpenEventCounter.Text) + 1).ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
<Window
|
||||
x:Class="Samples.Tutorials.Balloons.BalloonSampleWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
Height="300"
|
||||
Width="300">
|
||||
<Grid>
|
||||
|
||||
<!-- the ToolTipText property is bound to the TextBox below -->
|
||||
<tb:TaskbarIcon
|
||||
x:Name="MyNotifyIcon"
|
||||
IconSource="/Icons/Error.ico"
|
||||
ToolTipText="Balloon Sample Icon" />
|
||||
<Button
|
||||
x:Name="btnShowStandardBalloon"
|
||||
Click="btnShowStandardBalloon_Click"
|
||||
Margin="26,74,29,0"
|
||||
Content="Show Standard Balloon" Height="29" VerticalAlignment="Top" />
|
||||
<Button
|
||||
x:Name="btnShowCustomBalloon"
|
||||
Click="btnShowCustomBalloon_Click"
|
||||
Margin="26,0,29,49"
|
||||
VerticalAlignment="Bottom"
|
||||
Height="27"
|
||||
Content="Show Custom Balloon" />
|
||||
<TextBlock
|
||||
Margin="26,26,24,0"
|
||||
VerticalAlignment="Top"
|
||||
FontWeight="Bold"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Language="de-ch"
|
||||
Text="Clicking on buttons shows balloon tips" />
|
||||
</TextBlock>
|
||||
<Button
|
||||
x:Name="btnHideStandardBalloon"
|
||||
Click="btnHideStandardBalloon_Click"
|
||||
Margin="26,113,29,122"
|
||||
Content="Hide Standard Balloon" />
|
||||
<Button
|
||||
x:Name="btnCloseCustomBalloon"
|
||||
Click="btnCloseCustomBalloon_Click"
|
||||
Margin="26,0,29,12"
|
||||
VerticalAlignment="Bottom"
|
||||
Height="27"
|
||||
Content="Close Custom Balloon" />
|
||||
|
||||
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,65 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Controls.Primitives;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Shapes;
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
|
||||
namespace Samples.Tutorials.Balloons
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for BalloonSampleWindow.xaml
|
||||
/// </summary>
|
||||
public partial class BalloonSampleWindow : Window
|
||||
{
|
||||
public BalloonSampleWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
//clean up notifyicon (would otherwise stay open until application finishes)
|
||||
MyNotifyIcon.Dispose();
|
||||
|
||||
base.OnClosing(e);
|
||||
}
|
||||
|
||||
|
||||
private void btnShowCustomBalloon_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
FancyBalloon balloon = new FancyBalloon();
|
||||
balloon.BalloonText = "Custom Balloon";
|
||||
|
||||
//show balloon and close it after 4 seconds
|
||||
MyNotifyIcon.ShowCustomBalloon(balloon, PopupAnimation.Slide, 4000);
|
||||
}
|
||||
|
||||
private void btnHideStandardBalloon_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MyNotifyIcon.HideBalloonTip();
|
||||
}
|
||||
|
||||
|
||||
private void btnShowStandardBalloon_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string title = "WPF NotifyIcon";
|
||||
string text = "This is a standard balloon";
|
||||
|
||||
MyNotifyIcon.ShowBalloonTip(title, text, MyNotifyIcon.Icon);
|
||||
}
|
||||
|
||||
private void btnCloseCustomBalloon_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MyNotifyIcon.CloseBalloon();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
<Window
|
||||
x:Class="Samples.Tutorials.Commands.CommandWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
xmlns:local="clr-namespace:Samples.Tutorials.Commands"
|
||||
Height="300"
|
||||
Width="300"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d">
|
||||
<Grid>
|
||||
|
||||
<!-- declare the command as a local resource -->
|
||||
<Grid.Resources>
|
||||
<local:ShowMessageCommand
|
||||
x:Key="MessageCommand" />
|
||||
</Grid.Resources>
|
||||
|
||||
<!-- declare the NotifyIcon and configure commands with parameters -->
|
||||
<tb:TaskbarIcon
|
||||
x:Name="CustomCommandNotifyIcon"
|
||||
IconSource="/Icons/Error.ico"
|
||||
LeftClickCommand="{StaticResource MessageCommand}"
|
||||
LeftClickCommandParameter="Left mouse button was clicked"
|
||||
DoubleClickCommand="{StaticResource MessageCommand}"
|
||||
DoubleClickCommandParameter="Double click on NotifyIcon" />
|
||||
|
||||
<!-- declare the NotifyIcon and configure commands with targets -->
|
||||
<tb:TaskbarIcon
|
||||
x:Name="RoutedCommandNotifyIcon"
|
||||
IconSource="/Icons/Inactive.ico"
|
||||
LeftClickCommand="ApplicationCommands.Cut"
|
||||
LeftClickCommandTarget="{Binding ElementName=txtInput}"
|
||||
DoubleClickCommand="ApplicationCommands.Paste"
|
||||
DoubleClickCommandTarget="{Binding ElementName=txtInput}" />
|
||||
|
||||
|
||||
<TextBlock
|
||||
Margin="26,26,24,0"
|
||||
VerticalAlignment="Top"
|
||||
FontWeight="Bold"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Language="de-ch"
|
||||
Text="Left / Double clicks on red NotifyIcon executes simple custom commands." />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
Margin="26,112,24,80"
|
||||
FontWeight="Bold"
|
||||
TextWrapping="Wrap">
|
||||
<Run Language="de-ch" Text="Left / Double clicks on grey NotifyIcon executes routed commands." />
|
||||
<LineBreak /><Run Language="de-ch" Text="Single click: Cuts selected text" /><LineBreak />
|
||||
<Run Language="de-ch" Text="Double click: Paste text from clipboard" />
|
||||
</TextBlock>
|
||||
<TextBox
|
||||
Margin="26,0,24,48"
|
||||
VerticalAlignment="Bottom"
|
||||
Height="22"
|
||||
Text="hello world"
|
||||
TextWrapping="Wrap"
|
||||
x:Name="txtInput" />
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,36 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace Samples.Tutorials.Commands
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for CommandWindow.xaml
|
||||
/// </summary>
|
||||
public partial class CommandWindow : Window
|
||||
{
|
||||
public CommandWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
|
||||
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
//clean up notifyicon (would otherwise stay open until application finishes)
|
||||
CustomCommandNotifyIcon.Dispose();
|
||||
RoutedCommandNotifyIcon.Dispose();
|
||||
|
||||
base.OnClosing(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
using System;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace Samples.Tutorials.Commands
|
||||
{
|
||||
/// <summary>
|
||||
/// A simple command that displays the command parameter as
|
||||
/// a dialog message.
|
||||
/// </summary>
|
||||
public class ShowMessageCommand : ICommand
|
||||
{
|
||||
public void Execute(object parameter)
|
||||
{
|
||||
MessageBox.Show(parameter.ToString());
|
||||
}
|
||||
|
||||
public bool CanExecute(object parameter)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public event EventHandler CanExecuteChanged;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,265 @@
|
||||
<Window
|
||||
x:Class="Samples.Tutorials.Events.EventVisualizerWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
Height="300"
|
||||
Width="300">
|
||||
<Window.Resources>
|
||||
<Storyboard
|
||||
x:Key="ShowMovement"
|
||||
AutoReverse="True">
|
||||
<DoubleAnimationUsingKeyFrames
|
||||
BeginTime="00:00:00"
|
||||
Storyboard.TargetName="MoveIndicator"
|
||||
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:00"
|
||||
Value="1" />
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:00.1000000"
|
||||
Value="1.2" />
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
<DoubleAnimationUsingKeyFrames
|
||||
BeginTime="00:00:00"
|
||||
Storyboard.TargetName="MoveIndicator"
|
||||
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:00"
|
||||
Value="1" />
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:00.1000000"
|
||||
Value="1.2" />
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
</Storyboard>
|
||||
<Storyboard
|
||||
x:Key="ShowMouseUp"
|
||||
AutoReverse="True">
|
||||
<DoubleAnimationUsingKeyFrames
|
||||
BeginTime="00:00:00"
|
||||
Storyboard.TargetName="LeftMouseIndicator"
|
||||
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:00"
|
||||
Value="1" />
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:00.1000000"
|
||||
Value="1.35" />
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
<DoubleAnimationUsingKeyFrames
|
||||
BeginTime="00:00:00"
|
||||
Storyboard.TargetName="LeftMouseIndicator"
|
||||
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:00"
|
||||
Value="1" />
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:00.1000000"
|
||||
Value="1.35" />
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
</Storyboard>
|
||||
<Storyboard
|
||||
x:Key="ShowToolTipOpened"
|
||||
AutoReverse="True">
|
||||
<DoubleAnimationUsingKeyFrames
|
||||
BeginTime="00:00:00"
|
||||
Storyboard.TargetName="ToolTipIndicator"
|
||||
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:00"
|
||||
Value="1" />
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:00.2000000"
|
||||
Value="1.4" />
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
<DoubleAnimationUsingKeyFrames
|
||||
BeginTime="00:00:00"
|
||||
Storyboard.TargetName="ToolTipIndicator"
|
||||
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:00"
|
||||
Value="1" />
|
||||
<SplineDoubleKeyFrame
|
||||
KeyTime="00:00:00.2000000"
|
||||
Value="1.4" />
|
||||
</DoubleAnimationUsingKeyFrames>
|
||||
</Storyboard>
|
||||
</Window.Resources>
|
||||
<Window.Triggers>
|
||||
<EventTrigger
|
||||
RoutedEvent="tb:TaskbarIcon.TrayMouseMove"
|
||||
SourceName="notifyIcon">
|
||||
<BeginStoryboard
|
||||
Storyboard="{StaticResource ShowMovement}" />
|
||||
</EventTrigger>
|
||||
<EventTrigger
|
||||
RoutedEvent="tb:TaskbarIcon.TrayLeftMouseUp"
|
||||
SourceName="notifyIcon">
|
||||
<BeginStoryboard
|
||||
Storyboard="{StaticResource ShowMouseUp}"
|
||||
x:Name="ShowMouseUp_BeginStoryboard" />
|
||||
</EventTrigger>
|
||||
<EventTrigger
|
||||
RoutedEvent="tb:TaskbarIcon.TrayToolTipOpen"
|
||||
SourceName="notifyIcon">
|
||||
<BeginStoryboard
|
||||
Storyboard="{StaticResource ShowToolTipOpened}"
|
||||
x:Name="ShowToolTipOpened_BeginStoryboard" />
|
||||
</EventTrigger>
|
||||
</Window.Triggers>
|
||||
<Grid>
|
||||
|
||||
<!-- the NotifyIcon does not need to be configured here - animations were set up in Blend -->
|
||||
<tb:TaskbarIcon
|
||||
x:Name="notifyIcon"
|
||||
ToolTipText="hello world"
|
||||
IconSource="/Icons/Error.ico" />
|
||||
|
||||
|
||||
<Ellipse
|
||||
HorizontalAlignment="Left"
|
||||
Margin="24,62,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Width="19"
|
||||
Height="19"
|
||||
Stroke="#FF549D2D"
|
||||
x:Name="MoveIndicator"
|
||||
RenderTransformOrigin="0.5,0.5">
|
||||
<Ellipse.RenderTransform>
|
||||
<TransformGroup>
|
||||
<ScaleTransform
|
||||
ScaleX="1"
|
||||
ScaleY="1" />
|
||||
<SkewTransform
|
||||
AngleX="0"
|
||||
AngleY="0" />
|
||||
<RotateTransform
|
||||
Angle="0" />
|
||||
<TranslateTransform
|
||||
X="0"
|
||||
Y="0" />
|
||||
</TransformGroup>
|
||||
</Ellipse.RenderTransform>
|
||||
<Ellipse.Fill>
|
||||
<LinearGradientBrush
|
||||
EndPoint="0.528,0.694"
|
||||
StartPoint="-0.056,-0.118">
|
||||
<GradientStop
|
||||
Color="#FFFFFFFF"
|
||||
Offset="0" />
|
||||
<GradientStop
|
||||
Color="#FF65A135"
|
||||
Offset="1" />
|
||||
</LinearGradientBrush>
|
||||
</Ellipse.Fill>
|
||||
</Ellipse>
|
||||
<Ellipse
|
||||
Stroke="#FF549D2D"
|
||||
HorizontalAlignment="Left"
|
||||
Margin="24,106,0,0"
|
||||
VerticalAlignment="Top"
|
||||
Width="19"
|
||||
Height="19"
|
||||
x:Name="LeftMouseIndicator"
|
||||
RenderTransformOrigin="0.5,0.5">
|
||||
<Ellipse.RenderTransform>
|
||||
<TransformGroup>
|
||||
<ScaleTransform />
|
||||
<SkewTransform
|
||||
AngleX="0"
|
||||
AngleY="0" />
|
||||
<RotateTransform
|
||||
Angle="0" />
|
||||
<TranslateTransform
|
||||
X="0"
|
||||
Y="0" />
|
||||
</TransformGroup>
|
||||
</Ellipse.RenderTransform>
|
||||
<Ellipse.Fill>
|
||||
<LinearGradientBrush
|
||||
EndPoint="0.528,0.694"
|
||||
StartPoint="-0.056,-0.118">
|
||||
<GradientStop
|
||||
Color="#FFFFFFFF"
|
||||
Offset="0" />
|
||||
<GradientStop
|
||||
Color="#FF65A135"
|
||||
Offset="1" />
|
||||
</LinearGradientBrush>
|
||||
</Ellipse.Fill>
|
||||
</Ellipse>
|
||||
<Ellipse
|
||||
Stroke="#FF549D2D"
|
||||
HorizontalAlignment="Left"
|
||||
Margin="24,0,0,94"
|
||||
Width="19"
|
||||
x:Name="ToolTipIndicator"
|
||||
RenderTransformOrigin="0.5,0.5"
|
||||
Height="19"
|
||||
VerticalAlignment="Bottom">
|
||||
<Ellipse.RenderTransform>
|
||||
<TransformGroup>
|
||||
<ScaleTransform
|
||||
ScaleX="1"
|
||||
ScaleY="1" />
|
||||
<SkewTransform
|
||||
AngleX="0"
|
||||
AngleY="0" />
|
||||
<RotateTransform
|
||||
Angle="0" />
|
||||
<TranslateTransform
|
||||
X="0"
|
||||
Y="0" />
|
||||
</TransformGroup>
|
||||
</Ellipse.RenderTransform>
|
||||
<Ellipse.Fill>
|
||||
<LinearGradientBrush
|
||||
EndPoint="0.528,0.694"
|
||||
StartPoint="-0.056,-0.118">
|
||||
<GradientStop
|
||||
Color="#FFFFFFFF"
|
||||
Offset="0" />
|
||||
<GradientStop
|
||||
Color="#FF65A135"
|
||||
Offset="1" />
|
||||
</LinearGradientBrush>
|
||||
</Ellipse.Fill>
|
||||
</Ellipse>
|
||||
<TextBlock
|
||||
Margin="63,62,91,0"
|
||||
VerticalAlignment="Top"
|
||||
Height="19"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Language="de-ch"
|
||||
Text="TrayMouseMove Event" />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
Margin="63,106,91,0"
|
||||
VerticalAlignment="Top"
|
||||
Height="19"
|
||||
TextWrapping="Wrap">
|
||||
<Run
|
||||
Language="de-ch"
|
||||
Text="TrayLeftMouseUp Event" />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
Margin="63,0,91,94"
|
||||
TextWrapping="Wrap"
|
||||
VerticalAlignment="Bottom"
|
||||
Height="19">
|
||||
<Run
|
||||
Language="de-ch"
|
||||
Text="TrayToolTipOpen Event" />
|
||||
</TextBlock>
|
||||
<TextBlock
|
||||
Margin="10,10,10,0"
|
||||
VerticalAlignment="Top"
|
||||
Height="31"
|
||||
TextWrapping="Wrap"
|
||||
FontWeight="Bold">
|
||||
<Run Language="de-ch" Text="The green ellipses are animated based on routed events of the NotifyIcon" />
|
||||
</TextBlock>
|
||||
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,24 @@
|
||||
using System.Windows;
|
||||
|
||||
namespace Samples.Tutorials.Events
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for EventVisualizerWindow.xaml
|
||||
/// </summary>
|
||||
public partial class EventVisualizerWindow : Window
|
||||
{
|
||||
public EventVisualizerWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
|
||||
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
//clean up notifyicon (would otherwise stay open until application finishes)
|
||||
notifyIcon.Dispose();
|
||||
|
||||
base.OnClosing(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
<Window x:Class="Samples.Tutorials.DataBinding.DataBoundToolTipWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
Height="300"
|
||||
Width="500">
|
||||
<Grid>
|
||||
|
||||
<!-- the ToolTipText property is bound to the TextBox below -->
|
||||
<tb:TaskbarIcon x:Name="MyNotifyIcon1"
|
||||
IconSource="/Icons/Error.ico"
|
||||
ToolTipText="{Binding ElementName=txtToolTip, Path=Text}">
|
||||
|
||||
<!--
|
||||
The TextBlock bound to the ToolTipText property of the NotifyIcon
|
||||
The binding is implicit (using DataContext)
|
||||
-->
|
||||
<tb:TaskbarIcon.TrayToolTip>
|
||||
<Border Background="White"
|
||||
BorderBrush="Orange"
|
||||
BorderThickness="2"
|
||||
CornerRadius="4"
|
||||
Opacity="0.8"
|
||||
Width="160"
|
||||
Height="40">
|
||||
<TextBlock Text="{Binding Path=ToolTipText}"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center" />
|
||||
</Border>
|
||||
</tb:TaskbarIcon.TrayToolTip>
|
||||
|
||||
</tb:TaskbarIcon>
|
||||
|
||||
|
||||
<!-- This NotifyIcon has its DataContext set (just the string "WPF FTW") - implicit binding is no longer possible -->
|
||||
<tb:TaskbarIcon x:Name="MyNotifyIcon2"
|
||||
DataContext="WPF FTW "
|
||||
IconSource="/Icons/Inactive.ico"
|
||||
ToolTipText="{Binding ElementName=txtToolTip, Path=Text}">
|
||||
|
||||
<tb:TaskbarIcon.TrayToolTip>
|
||||
|
||||
<!--
|
||||
Important: The attached property is assigned to the border, but derived by all controls.
|
||||
The NotifyIcon does not touch the underlying controls.
|
||||
-->
|
||||
<Border Background="White"
|
||||
BorderBrush="Orange"
|
||||
BorderThickness="2"
|
||||
CornerRadius="4"
|
||||
Opacity="0.8"
|
||||
Width="160"
|
||||
Height="40">
|
||||
<!-- Implicitly access the DataContext (which is a string this time)-->
|
||||
<TextBlock Text="{Binding}">
|
||||
<!-- Explicitly access the NotifyIcon, as it is an attached property -->
|
||||
<TextBlock Text="{Binding RelativeSource={RelativeSource Self},
|
||||
Path=(tb:TaskbarIcon.ParentTaskbarIcon).ToolTipText}"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center" />
|
||||
</TextBlock>
|
||||
</Border>
|
||||
</tb:TaskbarIcon.TrayToolTip>
|
||||
|
||||
</tb:TaskbarIcon>
|
||||
|
||||
|
||||
<TextBlock Margin="26,26,24,0"
|
||||
VerticalAlignment="Top"
|
||||
TextWrapping="Wrap"
|
||||
FontWeight="Bold">
|
||||
<Run Text="This sample shows data bound ToolTips in two flavors" /><LineBreak /><Run Text="" />
|
||||
<LineBreak /><Run Text="- implicit binding via DataContext" /><LineBreak />
|
||||
<Run Text="- explicit binding via ParentTaskbarIcon (attached property)" /><LineBreak /><Run Text="" />
|
||||
<LineBreak /><Run Text="Move over NotifyIcons (grey / red) to show data bound ToolTip" />
|
||||
</TextBlock>
|
||||
<TextBox Margin="26,0,24,10"
|
||||
Text="hello world"
|
||||
TextWrapping="Wrap"
|
||||
x:Name="txtToolTip"
|
||||
Height="25"
|
||||
VerticalAlignment="Bottom" />
|
||||
<TextBlock Margin="26,0,125,45"
|
||||
VerticalAlignment="Bottom"
|
||||
Height="26"
|
||||
TextWrapping="Wrap">
|
||||
<Run Text="ToolTipText:" />
|
||||
</TextBlock>
|
||||
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,25 @@
|
||||
using System.Windows;
|
||||
|
||||
namespace Samples.Tutorials.DataBinding
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for DataBoundToolTipWindow.xaml
|
||||
/// </summary>
|
||||
public partial class DataBoundToolTipWindow : Window
|
||||
{
|
||||
public DataBoundToolTipWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
|
||||
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
|
||||
{
|
||||
//clean up notifyicon (would otherwise stay open until application finishes)
|
||||
MyNotifyIcon1.Dispose();
|
||||
MyNotifyIcon2.Dispose();
|
||||
|
||||
base.OnClosing(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 20 KiB |
@@ -0,0 +1,37 @@
|
||||
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d"
|
||||
x:Class="Samples.Tutorials.MvvmSample.ClockPopup"
|
||||
x:Name="UserControl"
|
||||
Height="141"
|
||||
Width="304">
|
||||
<UserControl.Background>
|
||||
<LinearGradientBrush EndPoint="0.5,1"
|
||||
StartPoint="0.5,0">
|
||||
<GradientStop Color="#FFA8A8A8"
|
||||
Offset="0" />
|
||||
<GradientStop Color="White"
|
||||
Offset="1" />
|
||||
</LinearGradientBrush>
|
||||
</UserControl.Background>
|
||||
|
||||
<Grid x:Name="LayoutRoot">
|
||||
<Rectangle Stroke="#FF727272"/>
|
||||
<Image Source="Clock.png"
|
||||
Stretch="Fill"
|
||||
Height="128"
|
||||
VerticalAlignment="Top"
|
||||
HorizontalAlignment="Left"
|
||||
Width="128"
|
||||
Margin="10,10,0,0" />
|
||||
<TextBlock HorizontalAlignment="Left"
|
||||
Margin="143,0,0,0"
|
||||
TextWrapping="Wrap"
|
||||
Text="{Binding Timestamp}"
|
||||
VerticalAlignment="Center"
|
||||
FontSize="40"
|
||||
Foreground="#F2346172" />
|
||||
</Grid>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,15 @@
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace Samples.Tutorials.MvvmSample
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for ClockPopup.xaml
|
||||
/// </summary>
|
||||
public partial class ClockPopup : UserControl
|
||||
{
|
||||
public ClockPopup()
|
||||
{
|
||||
this.InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Windows;
|
||||
using System.Windows.Threading;
|
||||
|
||||
namespace Samples.Tutorials.MvvmSample
|
||||
{
|
||||
public class MvvmSampleViewModel : INotifyPropertyChanged
|
||||
{
|
||||
private DispatcherTimer timer;
|
||||
|
||||
public string Timestamp
|
||||
{
|
||||
get { return DateTime.Now.ToLongTimeString(); }
|
||||
}
|
||||
|
||||
|
||||
public MvvmSampleViewModel()
|
||||
{
|
||||
timer = new DispatcherTimer(TimeSpan.FromSeconds(1), DispatcherPriority.Normal, OnTimerTick, Application.Current.Dispatcher);
|
||||
}
|
||||
|
||||
private void OnTimerTick(object sender, EventArgs e)
|
||||
{
|
||||
//fire a property change event for the timestamp
|
||||
Application.Current.Dispatcher.BeginInvoke(new Action(() => OnPropertyChanged("Timestamp")));
|
||||
}
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
protected virtual void OnPropertyChanged(string propertyName)
|
||||
{
|
||||
PropertyChangedEventHandler handler = PropertyChanged;
|
||||
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
<Window x:Class="Samples.Tutorials.MvvmSample.MvvmSampleWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:local="clr-namespace:Samples.Tutorials.MvvmSample"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
Title="MvvmSampleWindow"
|
||||
Height="300"
|
||||
Width="300">
|
||||
<Window.DataContext>
|
||||
<local:MvvmSampleViewModel />
|
||||
</Window.DataContext>
|
||||
<Grid>
|
||||
|
||||
|
||||
<!--
|
||||
the NotifyIcon automatically derives the DataContext of it's
|
||||
declaring view. Alternatively, you could just assign it manually
|
||||
-->
|
||||
<tb:TaskbarIcon IconSource="/Icons/Inactive.ico"
|
||||
ToolTipText="{Binding Timestamp}">
|
||||
<tb:TaskbarIcon.TrayPopup >
|
||||
<!-- the popup, here a custom user control, will also get the DataContext of the NotifyIcon -->
|
||||
<local:ClockPopup Opacity="0.8" />
|
||||
</tb:TaskbarIcon.TrayPopup>
|
||||
</tb:TaskbarIcon>
|
||||
|
||||
|
||||
|
||||
<TextBlock TextWrapping="Wrap"
|
||||
Text="MVVM is quite simple - content of the NotifyIcon derive its DataContext. Sample: Hover over the icon in order to see the bound ToolTipText. Click for a richer Popup that is bound to the same property."
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Top"
|
||||
Margin="10,10,10,0" />
|
||||
|
||||
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,15 @@
|
||||
using System.Windows;
|
||||
|
||||
namespace Samples.Tutorials.MvvmSample
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for MvvmSampleWindow.xaml
|
||||
/// </summary>
|
||||
public partial class MvvmSampleWindow : Window
|
||||
{
|
||||
public MvvmSampleWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
21
Hardcodet.NotifyIcon.Wpf/Source/Windowless Sample/App.xaml
Normal file
@@ -0,0 +1,21 @@
|
||||
<Application x:Class="Windowless_Sample.App"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
ShutdownMode="OnExplicitShutdown">
|
||||
<Application.Resources>
|
||||
|
||||
<!--
|
||||
Note that this application does not have a StartupUri declared, so no Window is automatically loaded.
|
||||
Also, the ShutdownMode was set to explicit, so we have to close the application programmatically
|
||||
-->
|
||||
|
||||
|
||||
<!-- merge NotifyIcon and related stuff into the application -->
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="NotifyIconResources.xaml" />
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
|
||||
</Application.Resources>
|
||||
</Application>
|
||||
@@ -0,0 +1,27 @@
|
||||
using System.Windows;
|
||||
using Hardcodet.Wpf.TaskbarNotification;
|
||||
|
||||
namespace Windowless_Sample
|
||||
{
|
||||
/// <summary>
|
||||
/// Simple application. Check the XAML for comments.
|
||||
/// </summary>
|
||||
public partial class App : Application
|
||||
{
|
||||
private TaskbarIcon notifyIcon;
|
||||
|
||||
protected override void OnStartup(StartupEventArgs e)
|
||||
{
|
||||
base.OnStartup(e);
|
||||
|
||||
//create the notifyicon (it's a resource declared in NotifyIconResources.xaml
|
||||
notifyIcon = (TaskbarIcon) FindResource("NotifyIcon");
|
||||
}
|
||||
|
||||
protected override void OnExit(ExitEventArgs e)
|
||||
{
|
||||
notifyIcon.Dispose(); //the icon would clean up automatically, but this is cleaner
|
||||
base.OnExit(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
<Window x:Class="Windowless_Sample.MainWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
Title="MainWindow" Height="350" Width="525">
|
||||
<Grid>
|
||||
<TextBlock Text="Have a look at App.xaml and App.xaml.cs to see how things are working" />
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace Windowless_Sample
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for MainWindow.xaml
|
||||
/// </summary>
|
||||
public partial class MainWindow : Window
|
||||
{
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:tb="http://www.hardcodet.net/taskbar"
|
||||
xmlns:local="clr-namespace:Windowless_Sample">
|
||||
|
||||
<!-- The taskbar context menu - the first row is a dummy to show off simple data binding -->
|
||||
<!--
|
||||
The "shared" directive is needed if we reopen the sample window a few times - WPF will otherwise
|
||||
reuse the same context menu (which is a resource) again (which will have its DataContext set to the old TaskbarIcon)
|
||||
-->
|
||||
<ContextMenu x:Shared="false" x:Key="SysTrayMenu">
|
||||
<MenuItem Header="Show Window" Command="{Binding ShowWindowCommand}" />
|
||||
<MenuItem Header="Hide Window" Command="{Binding HideWindowCommand}" />
|
||||
<Separator />
|
||||
<MenuItem Header="Exit" Command="{Binding ExitApplicationCommand}" />
|
||||
</ContextMenu>
|
||||
|
||||
|
||||
<!-- the application's NotifyIcon - started from App.xaml.cs. Declares its own view model. -->
|
||||
<tb:TaskbarIcon x:Key="NotifyIcon"
|
||||
IconSource="/Red.ico"
|
||||
ToolTipText="Double-click for window, right-click for menu"
|
||||
DoubleClickCommand="{Binding ShowWindowCommand}"
|
||||
ContextMenu="{StaticResource SysTrayMenu}">
|
||||
|
||||
<!-- self-assign a data context (could also be done programmatically) -->
|
||||
<tb:TaskbarIcon.DataContext>
|
||||
<local:NotifyIconViewModel />
|
||||
</tb:TaskbarIcon.DataContext>
|
||||
</tb:TaskbarIcon>
|
||||
|
||||
</ResourceDictionary>
|
||||
@@ -0,0 +1,86 @@
|
||||
using System;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace Windowless_Sample
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides bindable properties and commands for the NotifyIcon. In this sample, the
|
||||
/// view model is assigned to the NotifyIcon in XAML. Alternatively, the startup routing
|
||||
/// in App.xaml.cs could have created this view model, and assigned it to the NotifyIcon.
|
||||
/// </summary>
|
||||
public class NotifyIconViewModel
|
||||
{
|
||||
/// <summary>
|
||||
/// Shows a window, if none is already open.
|
||||
/// </summary>
|
||||
public ICommand ShowWindowCommand
|
||||
{
|
||||
get
|
||||
{
|
||||
return new DelegateCommand
|
||||
{
|
||||
CanExecuteFunc = () => Application.Current.MainWindow == null,
|
||||
CommandAction = () =>
|
||||
{
|
||||
Application.Current.MainWindow = new MainWindow();
|
||||
Application.Current.MainWindow.Show();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Hides the main window. This command is only enabled if a window is open.
|
||||
/// </summary>
|
||||
public ICommand HideWindowCommand
|
||||
{
|
||||
get
|
||||
{
|
||||
return new DelegateCommand
|
||||
{
|
||||
CommandAction = () => Application.Current.MainWindow.Close(),
|
||||
CanExecuteFunc = () => Application.Current.MainWindow != null
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Shuts down the application.
|
||||
/// </summary>
|
||||
public ICommand ExitApplicationCommand
|
||||
{
|
||||
get
|
||||
{
|
||||
return new DelegateCommand {CommandAction = () => Application.Current.Shutdown()};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Simplistic delegate command for the demo.
|
||||
/// </summary>
|
||||
public class DelegateCommand : ICommand
|
||||
{
|
||||
public Action CommandAction { get; set; }
|
||||
public Func<bool> CanExecuteFunc { get; set; }
|
||||
|
||||
public void Execute(object parameter)
|
||||
{
|
||||
CommandAction();
|
||||
}
|
||||
|
||||
public bool CanExecute(object parameter)
|
||||
{
|
||||
return CanExecuteFunc == null || CanExecuteFunc();
|
||||
}
|
||||
|
||||
public event EventHandler CanExecuteChanged
|
||||
{
|
||||
add { CommandManager.RequerySuggested += value; }
|
||||
remove { CommandManager.RequerySuggested -= value; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
using System.Reflection;
|
||||
using System.Resources;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("Windowless Sample")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("Windowless Sample")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2013")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
//In order to begin building localizable applications, set
|
||||
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
|
||||
//inside a <PropertyGroup>. For example, if you are using US english
|
||||
//in your source files, set the <UICulture> to en-US. Then uncomment
|
||||
//the NeutralResourceLanguage attribute below. Update the "en-US" in
|
||||
//the line below to match the UICulture setting in the project file.
|
||||
|
||||
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
|
||||
|
||||
|
||||
[assembly: ThemeInfo(
|
||||
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
|
||||
//(used if a resource is not found in the page,
|
||||
// or application resource dictionaries)
|
||||
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
|
||||
//(used if a resource is not found in the page,
|
||||
// app, or any theme specific resource dictionaries)
|
||||
)]
|
||||
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||