47 Commits

Author SHA1 Message Date
Daniel Clark 10499366d6 further work to get placement in a multi mon setup working properly 2021-03-02 20:36:14 +00:00
Daniel Clark 24bdc3caa2 Continue to tweak offset 2021-03-01 20:36:31 +00:00
Daniel Clark ab7ea6415d Remove test code for resizing until a better solution comes up 2021-03-01 17:20:10 +00:00
Daniel Clark 0a6b227fc6 fixed issue with DPI not updating 2021-03-01 16:02:58 +00:00
Daniel Clark dd92d25d23 Amend how we hide the xaml window 2021-02-28 18:48:49 +00:00
Daniel Clark b815985963 fix issue with DPI 2021-02-28 18:45:12 +00:00
Daniel Clark 04de82cda0 Allow placement to be updated at run time 2021-02-27 20:27:56 +00:00
Daniel Clark efc2f75d85 implemented FullRight placement mode 2021-02-27 20:19:58 +00:00
Daniel Clark 47540457b8 show popup first and then set the placement... this is to ensure we are getting the correct size 2021-02-27 17:40:05 +00:00
Daniel Clark 1800eefd5a Amend how we hide via deactivation as the user may still want to call Hide explicitly while having IsLightDismissedEnabled set to false 2021-02-27 15:38:09 +00:00
Daniel Clark f9c688aa02 Added ability to keep the flyout open on the desktop which can be set via IsLightDismissEnabled DP 2021-02-27 15:24:47 +00:00
Daniel Clark 8e334912b9 Added offset value to offset the popup position by 1px 2021-02-27 14:18:32 +00:00
Daniel Clark 5db230c83c re-wired opened and closed events 2021-02-27 12:03:36 +00:00
Daniel Clark 240609270e fixed issue with margin 2021-02-27 11:57:23 +00:00
Daniel Clark 737dbe9b32 Major refactor to use Popup replacing the Flyout. This will allow for future enhancements. 2021-02-26 20:48:10 +00:00
Daniel Clark c408eafdde [WIP] Positioning of popup 2021-02-26 16:21:23 +00:00
Daniel Clark f0b42d1551 [WIP] Move over to a popup 2021-02-26 14:34:13 +00:00
Daniel Clark d25744a9f4 Added ability to set Auto or Right flyout placement 2021-02-25 17:39:19 +00:00
Daniel Clark 36f2953fd4 Added NotificationFlyoutPlacement enum 2021-02-25 15:08:45 +00:00
Daniel Clark bc42e0cff1 Remove max width and height from flyout style 2021-02-25 15:02:42 +00:00
Daniel Clark d48d0bd590 Added showcase section to read me 2021-02-15 22:50:40 +00:00
Daniel Clark 6751bc914e Update readme 2021-02-15 22:37:00 +00:00
Daniel Clark ac1ace291c Remove steps for setting notification icons 2021-02-15 22:35:51 +00:00
Daniel Clark 60d2989ff5 Update readme to refer to updated packages 2021-02-15 21:58:26 +00:00
Daniel Clark c995e45606 Update sample and version number 2021-02-15 21:35:42 +00:00
Daniel Clark 9fa476e57d Update version 2021-02-15 21:21:50 +00:00
Daniel Clark b96155be73 Moved EntranceThemeTransition and ThemeShadow to the Presenter style, this allows the margin to be set around the content of the shadow thus allowing you to offset the flyout via the margin property 2021-02-15 15:19:57 +00:00
Daniel Clark 68107307b0 Updated reference in sample 2021-02-15 14:38:51 +00:00
Daniel Clark 30b04b1fcc Project changes meaning the UWP stuff cannot relay on .Common stuff, this all has all happen in the host and then referred up to the UWP control, or else the UWP project would of had to carry a boat load of unsupported packages!! 2021-02-15 13:00:32 +00:00
Daniel Clark 36259ccb6b accidental blowout of the project files 2021-02-15 12:21:59 +00:00
Daniel Clark 49169b1044 [WIP] Non-functional now playing flyout sample 2021-02-15 00:06:51 +00:00
Daniel Clark b920a4622a Support setting notification tray icon as a png 2021-02-14 22:03:12 +00:00
Daniel Clark 50033d9aa3 Added notification icon fallback support 2021-02-14 20:59:45 +00:00
Daniel Clark 9869470c24 Use ThemeResource for resolving AccentBrush 2021-02-14 16:04:28 +00:00
Daniel Clark 2ace378529 Added support for switching to Accent background color if the user requests this via Windows theme settings 2021-02-14 15:58:39 +00:00
Daniel Clark 8dce9f882b It's no or never... remap Namespaces with TheXamlGuy.* prefix 2021-02-14 15:31:07 +00:00
Daniel Clark 2d74e40948 Rename namespaces with TheGuyXaml prefix 2021-02-14 15:21:14 +00:00
Daniel Clark cadf8f9ec0 Reorg project folders 2021-02-14 15:19:33 +00:00
Daniel Clark 266f1938c3 Rename projects 2021-02-14 15:17:01 +00:00
Daniel Clark 2401235aca Rename solution 2021-02-14 15:11:34 +00:00
Daniel Clark cef6e99e74 clean up wpf.ui some more 2021-02-13 17:18:45 +00:00
Daniel Clark ce314678b5 Moved all PInvokes to a lower class without any relianceon WPF, NotificationIconHelper, TaskbarHelper, SystemPersonalisationHelper are WPF window no more 2021-02-13 17:08:00 +00:00
Daniel Clark 20441d5749 Tunnel flyout events to top level notificationflyout so users can handle events accordingly. 2021-02-13 11:47:55 +00:00
Daniel Clark c7b80cc997 Remove unnecessary flyout style setters 2021-02-13 00:10:26 +00:00
Daniel Clark af1800e725 fixed scrolling issue 2021-02-13 00:08:11 +00:00
Daniel Clark ee7530b8b5 Added support common styling properties via NotificationFlyout 2021-02-12 23:44:52 +00:00
Daniel Clark 84afcf0be3 refactoring for the next stage 2021-02-12 23:23:41 +00:00
132 changed files with 2161 additions and 2647 deletions
+10 -8
View File
@@ -4,6 +4,12 @@ A Notification Flyout that looks and feels exactly like the native Volume, Netwo
# Demo #
[![](http://img.youtube.com/vi/8EoZ4pGWTkY/0.jpg)](http://www.youtube.com/watch?v=8EoZ4pGWTkY "Notification flyout demo")
# Show case #
[NotificationFlyout.NowPlaying](https://github.com/TheXamlGuy/NotificationFlyout.NowPlaying)
![](https://github.com/TheXamlGuy/NotificationFlyout.NowPlaying/blob/master/wip_concept.png)
# Getting started #
Many parts of this guide refers to the [Host a custom WinRT XAML control in a WPF app using XAML Islands](https://docs.microsoft.com/en-us/windows/apps/desktop/modernize/host-custom-control-with-xaml-islands) article. If in doubt, refer to the article, or post an issue on this repro.
@@ -33,16 +39,14 @@ namespace MyUWPApp
}
}
```
5. In the UWP app project, install the [NotificationFlyout.Uwp.UI.Controls](https://www.nuget.org/packages/NotificationFlyout.Uwp.UI.Controls/) NuGet package (latest stable version).
3. Open the `MainPage.xaml` file and replace the contents of this file with the following XAML. Replace `MyUWPApp` with the namespace of your UWP app project.
5. In the UWP app project, install the [TheXamlGuy.NotificationFlyout.Uwp.UI.Controls](https://www.nuget.org/packages/TheXamlGuy.NotificationFlyout.Uwp.UI.Controls/) NuGet package (latest stable version).
6. Open the `MainPage.xaml` file and replace the contents of this file with the following XAML. Replace `MyUWPApp` with the namespace of your UWP app project.
```xaml
<controls:NotificationFlyout
x:Class="MyUWPApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:NotificationFlyout.Uwp.UI.Controls"
IconSource="/Assets/Icon.ico"
LightIconSource="/Assets/Icon-Light.ico">
xmlns:controls="using:NotificationFlyout.Uwp.UI.Controls">
<Grid Width="400" Height="500">
<Button
HorizontalAlignment="Center"
@@ -51,8 +55,6 @@ namespace MyUWPApp
</Grid>
</controls:NotificationFlyout>
```
5. In the UWP app project, add two icons (.ico) to the Assets folder.
6. Replace the values of `IconSource` and `LightIconSource` with the paths of the icons that you have added to your Assets folder.
7. Clean the UWP app project and then build it.
## Create a WPF project ##
@@ -72,7 +74,7 @@ namespace MyUWPApp
</Project>
```
5. In Solution Explorer, right-click the Dependencies node under the WPF project and add a reference to your UWP app project.
6. In the WPF app project, install the [Microsoft.Toolkit.Wpf.UI.XamlHost](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.XamlHost) and [NotificationFlyout.Wpf.UI.Controls](https://www.nuget.org/packages/NotificationFlyout.Wpf.UI.Controls/) NuGet packages (latest stable version).
6. In the WPF app project, install the [Microsoft.Toolkit.Wpf.UI.XamlHost](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.XamlHost) and [TheXamlGuy.NotificationFlyout.Wpf.UI.Controls](https://www.nuget.org/packages/TheXamlGuy.NotificationFlyout.Wpf.UI.Controls/) NuGet packages (latest stable version).
7. Open the `App.xaml` file and replace the contents of this file with the following XAML. Replace `MyWPFApp` with the namespace of your WPF app project.
```xaml
<Application
@@ -1,27 +0,0 @@
<Project Sdk="MSBuild.Sdk.Extras">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UseWPF>true</UseWPF>
<Platforms>x64</Platforms>
<AssetTargetFallback>uap10.0.19041</AssetTargetFallback>
<StartupObject>NotificationFlyoutSample.Host.Program</StartupObject>
<EnableTypeInfoReflection>false</EnableTypeInfoReflection>
<EnableXBindDiagnostics>false</EnableXBindDiagnostics>
<MSBuildWarningsAsMessages>NU1702</MSBuildWarningsAsMessages>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Toolkit.Wpf.UI.XamlHost" Version="6.1.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\NotificationFlyout.Uwp.UI.Controls\NotificationFlyout.Uwp.UI.Controls.csproj" />
<ProjectReference Include="..\..\src\NotificationFlyout.Uwp.UI\NotificationFlyout.Uwp.UI.csproj" />
<ProjectReference Include="..\..\src\NotificationFlyout.Wpf.UI.Controls\NotificationFlyout.Wpf.UI.Controls.csproj" />
<ProjectReference Include="..\..\src\NotificationFlyout.Wpf.UI\NotificationFlyout.Wpf.UI.csproj" />
<ProjectReference Include="..\NotificationFlyoutSample\NotificationFlyoutSample.csproj" />
</ItemGroup>
</Project>
@@ -1,22 +0,0 @@
using NotificationFlyout.Wpf.UI.Controls;
using System;
namespace NotificationFlyoutSample.Host
{
public class Program
{
[STAThread()]
public static void Main()
{
using (new NotificationFlyoutSample.App())
{
var app = new App();
new NotificationFlyoutApplication
{
Flyout = new Shell()
};
app.Run();
}
}
}
}
@@ -0,0 +1,32 @@
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UseWPF>true</UseWPF>
<StartupObject>NotificationFlyoutSample.Host.Program</StartupObject>
<AssetTargetFallback>uap10.0.19041</AssetTargetFallback>
<Platforms>x64</Platforms>
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Toolkit.Wpf.UI.XamlHost" Version="6.1.2" />
<PackageReference Include="Microsoft.Win32.Registry" Version="6.0.0-preview.1.21102.12" />
<PackageReference Include="System.Drawing.Common" Version="6.0.0-preview.1.21102.12" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\TheXamlGuy.NotificationFlyout.Common\TheXamlGuy.NotificationFlyout.Common.csproj" />
<ProjectReference Include="..\..\src\TheXamlGuy.NotificationFlyout.Shared.UI\TheXamlGuy.NotificationFlyout.Shared.UI.csproj" />
<ProjectReference Include="..\..\src\TheXamlGuy.NotificationFlyout.Uwp.UI.Controls\TheXamlGuy.NotificationFlyout.Uwp.UI.Controls.csproj" />
<ProjectReference Include="..\..\src\TheXamlGuy.NotificationFlyout.Wpf.UI.Controls\TheXamlGuy.NotificationFlyout.Wpf.UI.Controls.csproj" />
<ProjectReference Include="..\..\src\TheXamlGuy.NotificationFlyout.Wpf.UI\TheXamlGuy.NotificationFlyout.Wpf.UI.csproj" />
<ProjectReference Include="..\NotificationFlyoutSample\NotificationFlyoutSample.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Update="Microsoft.VCRTForwarders.140" Version="1.0.7" />
</ItemGroup>
</Project>
@@ -1,5 +1,5 @@
using NotificationFlyout.Wpf.UI.Controls;
using System;
using System;
using TheXamlGuy.NotificationFlyout.Wpf.UI.Controls;
namespace NotificationFlyoutSample.Host
{
@@ -13,8 +13,9 @@ namespace NotificationFlyoutSample.Host
var app = new App();
new NotificationFlyoutApplication
{
Flyout = new Shell()
Flyout = new SampleFlyout()
};
app.Run();
}
}
@@ -50,12 +50,12 @@
</PropertyGroup>
<Import Project="$(WapProjPath)\Microsoft.DesktopBridge.props" />
<PropertyGroup>
<ProjectGuid>e2f52d15-a3bb-41ce-901c-ab491c50327a</ProjectGuid>
<ProjectGuid>faa7e8e0-032d-4c2a-bab6-6e0eed3d5a6d</ProjectGuid>
<TargetPlatformVersion>10.0.19041.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.19041.0</TargetPlatformMinVersion>
<DefaultLanguage>en-US</DefaultLanguage>
<AppxPackageSigningEnabled>false</AppxPackageSigningEnabled>
<EntryPointProjectUniqueName>..\NotificationFlyoutSample.Host\NotificationFlyoutSample.Host.csproj</EntryPointProjectUniqueName>
<EntryPointProjectUniqueName>..\NotificationFlyoutSample.Launcher\NotificationFlyoutSample.Launcher.csproj</EntryPointProjectUniqueName>
</PropertyGroup>
<ItemGroup>
<AppxManifest Include="Package.appxmanifest">
@@ -76,7 +76,7 @@
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.19041.8" PrivateAssets="all" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NotificationFlyoutSample.Host\NotificationFlyoutSample.Host.csproj">
<ProjectReference Include="..\NotificationFlyoutSample.Launcher\NotificationFlyoutSample.Launcher.csproj">
<SkipGetTargetFrameworkProperties>True</SkipGetTargetFrameworkProperties>
</ProjectReference>
</ItemGroup>
@@ -7,13 +7,13 @@
IgnorableNamespaces="uap rescap">
<Identity
Name="b15dd450-41a7-49e9-bc4f-8192a7063ae2"
Publisher="CN=dan"
Name="541ef8e5-df48-4089-bae4-7851e8c5d592"
Publisher="CN=Daniel Clark"
Version="1.0.0.0" />
<Properties>
<DisplayName>NotificationFlyoutSample.Package</DisplayName>
<PublisherDisplayName>dan</PublisherDisplayName>
<PublisherDisplayName>Daniel Clark</PublisherDisplayName>
<Logo>Images\StoreLogo.png</Logo>
</Properties>
+127 -137
View File
@@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30914.41
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyoutSample.Host", "NotificationFlyoutSample.Host\NotificationFlyoutSample.Host.csproj", "{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotificationFlyoutSample", "NotificationFlyoutSample\NotificationFlyoutSample.csproj", "{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{1E895953-2231-4ACA-84A6-64F8F57FE86A}"
@@ -12,15 +10,17 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
global.json = global.json
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyout.Uwp.UI.Controls", "..\src\NotificationFlyout.Uwp.UI.Controls\NotificationFlyout.Uwp.UI.Controls.csproj", "{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyoutSample.Launcher", "NotificationFlyoutSample.Launcher\NotificationFlyoutSample.Launcher.csproj", "{5EDD254A-3F8E-4825-B806-5C230488E192}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyout.Wpf.UI", "..\src\NotificationFlyout.Wpf.UI\NotificationFlyout.Wpf.UI.csproj", "{49BCC188-22D2-468B-89EA-99C810BE790E}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TheXamlGuy.NotificationFlyout.Common", "..\src\TheXamlGuy.NotificationFlyout.Common\TheXamlGuy.NotificationFlyout.Common.csproj", "{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyout.Wpf.UI.Controls", "..\src\NotificationFlyout.Wpf.UI.Controls\NotificationFlyout.Wpf.UI.Controls.csproj", "{094A2030-C430-490B-AB26-205385A0D4BF}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TheXamlGuy.NotificationFlyout.Shared.UI", "..\src\TheXamlGuy.NotificationFlyout.Shared.UI\TheXamlGuy.NotificationFlyout.Shared.UI.csproj", "{875E7116-3A9B-4CBE-B6D0-20818DB77280}"
EndProject
Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "NotificationFlyoutSample.Package", "NotificationFlyoutSample.Package\NotificationFlyoutSample.Package.wapproj", "{E2F52D15-A3BB-41CE-901C-AB491C50327A}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TheXamlGuy.NotificationFlyout.Uwp.UI.Controls", "..\src\TheXamlGuy.NotificationFlyout.Uwp.UI.Controls\TheXamlGuy.NotificationFlyout.Uwp.UI.Controls.csproj", "{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyout.Uwp.UI", "..\src\NotificationFlyout.Uwp.UI\NotificationFlyout.Uwp.UI.csproj", "{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TheXamlGuy.NotificationFlyout.Wpf.UI", "..\src\TheXamlGuy.NotificationFlyout.Wpf.UI\TheXamlGuy.NotificationFlyout.Wpf.UI.csproj", "{F6040CB8-83EE-47B9-8DD7-DF43CD555956}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TheXamlGuy.NotificationFlyout.Wpf.UI.Controls", "..\src\TheXamlGuy.NotificationFlyout.Wpf.UI.Controls\TheXamlGuy.NotificationFlyout.Wpf.UI.Controls.csproj", "{66433384-A10C-44A5-B734-400990A569F0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -36,26 +36,6 @@ Global
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|Any CPU.ActiveCfg = Debug|x64
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|Any CPU.Build.0 = Debug|x64
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|ARM.ActiveCfg = Debug|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|ARM.Build.0 = Debug|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|ARM64.Build.0 = Debug|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|x64.ActiveCfg = Debug|x64
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|x64.Build.0 = Debug|x64
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|x86.ActiveCfg = Debug|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|x86.Build.0 = Debug|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|Any CPU.Build.0 = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|ARM.ActiveCfg = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|ARM.Build.0 = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|ARM64.ActiveCfg = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|ARM64.Build.0 = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|x64.ActiveCfg = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|x64.Build.0 = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|x86.ActiveCfg = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|x86.Build.0 = Release|Any CPU
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Debug|Any CPU.ActiveCfg = Debug|x64
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Debug|Any CPU.Build.0 = Debug|x64
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Debug|ARM.ActiveCfg = Debug|ARM
@@ -83,116 +63,126 @@ Global
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Release|x86.ActiveCfg = Release|x86
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Release|x86.Build.0 = Release|x86
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Release|x86.Deploy.0 = Release|x86
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|Any CPU.ActiveCfg = Debug|x64
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|Any CPU.Build.0 = Debug|x64
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|ARM.ActiveCfg = Debug|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|ARM.Build.0 = Debug|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|ARM64.Build.0 = Debug|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|x64.ActiveCfg = Debug|x64
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|x64.Build.0 = Debug|x64
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|x86.ActiveCfg = Debug|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|x86.Build.0 = Debug|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|Any CPU.Build.0 = Release|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|ARM.ActiveCfg = Release|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|ARM.Build.0 = Release|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|ARM64.ActiveCfg = Release|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|ARM64.Build.0 = Release|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|x64.ActiveCfg = Release|x64
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|x64.Build.0 = Release|x64
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|x86.ActiveCfg = Release|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|x86.Build.0 = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|Any CPU.ActiveCfg = Debug|x64
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|Any CPU.Build.0 = Debug|x64
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|ARM.ActiveCfg = Debug|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|ARM.Build.0 = Debug|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|ARM64.Build.0 = Debug|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|x64.ActiveCfg = Debug|x64
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|x64.Build.0 = Debug|x64
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|x86.ActiveCfg = Debug|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|x86.Build.0 = Debug|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|Any CPU.Build.0 = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|ARM.ActiveCfg = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|ARM.Build.0 = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|ARM64.ActiveCfg = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|ARM64.Build.0 = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|x64.ActiveCfg = Release|x64
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|x64.Build.0 = Release|x64
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|x86.ActiveCfg = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|x86.Build.0 = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|Any CPU.ActiveCfg = Debug|x64
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|Any CPU.Build.0 = Debug|x64
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|ARM.ActiveCfg = Debug|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|ARM.Build.0 = Debug|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|ARM64.Build.0 = Debug|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|x64.ActiveCfg = Debug|x64
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|x64.Build.0 = Debug|x64
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|x86.ActiveCfg = Debug|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|x86.Build.0 = Debug|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|Any CPU.Build.0 = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|ARM.ActiveCfg = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|ARM.Build.0 = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|ARM64.ActiveCfg = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|ARM64.Build.0 = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|x64.ActiveCfg = Release|x64
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|x64.Build.0 = Release|x64
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|x86.ActiveCfg = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|x86.Build.0 = Release|Any CPU
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|Any CPU.ActiveCfg = Debug|x64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|Any CPU.Build.0 = Debug|x64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|Any CPU.Deploy.0 = Debug|x64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|ARM.ActiveCfg = Debug|ARM
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|ARM.Build.0 = Debug|ARM
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|ARM.Deploy.0 = Debug|ARM
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|ARM64.ActiveCfg = Debug|ARM64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|ARM64.Build.0 = Debug|ARM64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|ARM64.Deploy.0 = Debug|ARM64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|x64.ActiveCfg = Debug|x64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|x64.Build.0 = Debug|x64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|x64.Deploy.0 = Debug|x64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|x86.ActiveCfg = Debug|x86
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|x86.Build.0 = Debug|x86
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Debug|x86.Deploy.0 = Debug|x86
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|Any CPU.Build.0 = Release|Any CPU
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|Any CPU.Deploy.0 = Release|Any CPU
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|ARM.ActiveCfg = Release|ARM
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|ARM.Build.0 = Release|ARM
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|ARM.Deploy.0 = Release|ARM
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|ARM64.ActiveCfg = Release|ARM64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|ARM64.Build.0 = Release|ARM64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|ARM64.Deploy.0 = Release|ARM64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|x64.ActiveCfg = Release|x64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|x64.Build.0 = Release|x64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|x64.Deploy.0 = Release|x64
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|x86.ActiveCfg = Release|x86
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|x86.Build.0 = Release|x86
{E2F52D15-A3BB-41CE-901C-AB491C50327A}.Release|x86.Deploy.0 = Release|x86
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Debug|ARM.ActiveCfg = Debug|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Debug|ARM.Build.0 = Debug|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Debug|ARM64.Build.0 = Debug|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Debug|x64.ActiveCfg = Debug|x64
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Debug|x64.Build.0 = Debug|x64
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Debug|x86.ActiveCfg = Debug|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Debug|x86.Build.0 = Debug|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Release|Any CPU.Build.0 = Release|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Release|ARM.ActiveCfg = Release|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Release|ARM.Build.0 = Release|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Release|ARM64.ActiveCfg = Release|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Release|ARM64.Build.0 = Release|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Release|x64.ActiveCfg = Release|x64
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Release|x64.Build.0 = Release|x64
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Release|x86.ActiveCfg = Release|Any CPU
{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}.Release|x86.Build.0 = Release|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Debug|ARM.ActiveCfg = Debug|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Debug|ARM.Build.0 = Debug|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Debug|ARM64.Build.0 = Debug|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Debug|x64.ActiveCfg = Debug|x64
{5EDD254A-3F8E-4825-B806-5C230488E192}.Debug|x64.Build.0 = Debug|x64
{5EDD254A-3F8E-4825-B806-5C230488E192}.Debug|x86.ActiveCfg = Debug|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Debug|x86.Build.0 = Debug|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Release|Any CPU.Build.0 = Release|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Release|ARM.ActiveCfg = Release|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Release|ARM.Build.0 = Release|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Release|ARM64.ActiveCfg = Release|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Release|ARM64.Build.0 = Release|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Release|x64.ActiveCfg = Release|x64
{5EDD254A-3F8E-4825-B806-5C230488E192}.Release|x64.Build.0 = Release|x64
{5EDD254A-3F8E-4825-B806-5C230488E192}.Release|x86.ActiveCfg = Release|Any CPU
{5EDD254A-3F8E-4825-B806-5C230488E192}.Release|x86.Build.0 = Release|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Debug|ARM.ActiveCfg = Debug|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Debug|ARM.Build.0 = Debug|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Debug|ARM64.Build.0 = Debug|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Debug|x64.ActiveCfg = Debug|x64
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Debug|x64.Build.0 = Debug|x64
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Debug|x86.ActiveCfg = Debug|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Debug|x86.Build.0 = Debug|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Release|Any CPU.Build.0 = Release|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Release|ARM.ActiveCfg = Release|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Release|ARM.Build.0 = Release|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Release|ARM64.ActiveCfg = Release|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Release|ARM64.Build.0 = Release|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Release|x64.ActiveCfg = Release|x64
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Release|x64.Build.0 = Release|x64
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Release|x86.ActiveCfg = Release|Any CPU
{5EE122E5-AFD9-4B03-A98D-34CBB0B3B3F0}.Release|x86.Build.0 = Release|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Debug|Any CPU.Build.0 = Debug|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Debug|ARM.ActiveCfg = Debug|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Debug|ARM.Build.0 = Debug|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Debug|ARM64.Build.0 = Debug|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Debug|x64.ActiveCfg = Debug|x64
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Debug|x64.Build.0 = Debug|x64
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Debug|x86.ActiveCfg = Debug|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Debug|x86.Build.0 = Debug|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Release|Any CPU.ActiveCfg = Release|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Release|Any CPU.Build.0 = Release|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Release|ARM.ActiveCfg = Release|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Release|ARM.Build.0 = Release|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Release|ARM64.ActiveCfg = Release|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Release|ARM64.Build.0 = Release|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Release|x64.ActiveCfg = Release|x64
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Release|x64.Build.0 = Release|x64
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Release|x86.ActiveCfg = Release|Any CPU
{875E7116-3A9B-4CBE-B6D0-20818DB77280}.Release|x86.Build.0 = Release|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Debug|ARM.ActiveCfg = Debug|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Debug|ARM.Build.0 = Debug|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Debug|ARM64.Build.0 = Debug|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Debug|x64.ActiveCfg = Debug|x64
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Debug|x64.Build.0 = Debug|x64
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Debug|x86.ActiveCfg = Debug|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Debug|x86.Build.0 = Debug|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Release|Any CPU.Build.0 = Release|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Release|ARM.ActiveCfg = Release|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Release|ARM.Build.0 = Release|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Release|ARM64.ActiveCfg = Release|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Release|ARM64.Build.0 = Release|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Release|x64.ActiveCfg = Release|x64
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Release|x64.Build.0 = Release|x64
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Release|x86.ActiveCfg = Release|Any CPU
{0C268B32-CED0-4F79-9CB0-B7AE84BE9EC8}.Release|x86.Build.0 = Release|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Debug|ARM.ActiveCfg = Debug|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Debug|ARM.Build.0 = Debug|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Debug|ARM64.Build.0 = Debug|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Debug|x64.ActiveCfg = Debug|x64
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Debug|x64.Build.0 = Debug|x64
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Debug|x86.ActiveCfg = Debug|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Debug|x86.Build.0 = Debug|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Release|Any CPU.Build.0 = Release|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Release|ARM.ActiveCfg = Release|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Release|ARM.Build.0 = Release|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Release|ARM64.ActiveCfg = Release|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Release|ARM64.Build.0 = Release|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Release|x64.ActiveCfg = Release|x64
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Release|x64.Build.0 = Release|x64
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Release|x86.ActiveCfg = Release|Any CPU
{F6040CB8-83EE-47B9-8DD7-DF43CD555956}.Release|x86.Build.0 = Release|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Debug|ARM.ActiveCfg = Debug|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Debug|ARM.Build.0 = Debug|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Debug|ARM64.Build.0 = Debug|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Debug|x64.ActiveCfg = Debug|x64
{66433384-A10C-44A5-B734-400990A569F0}.Debug|x64.Build.0 = Debug|x64
{66433384-A10C-44A5-B734-400990A569F0}.Debug|x86.ActiveCfg = Debug|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Debug|x86.Build.0 = Debug|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Release|Any CPU.Build.0 = Release|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Release|ARM.ActiveCfg = Release|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Release|ARM.Build.0 = Release|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Release|ARM64.ActiveCfg = Release|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Release|ARM64.Build.0 = Release|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Release|x64.ActiveCfg = Release|x64
{66433384-A10C-44A5-B734-400990A569F0}.Release|x64.Build.0 = Release|x64
{66433384-A10C-44A5-B734-400990A569F0}.Release|x86.ActiveCfg = Release|Any CPU
{66433384-A10C-44A5-B734-400990A569F0}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

@@ -1,6 +0,0 @@
<Application
x:Class="NotificationFlyoutSample.Host.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Application.Resources />
</Application>
@@ -1,17 +0,0 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace NotificationFlyoutSample.Host
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}
@@ -1,10 +0,0 @@
using System.Windows;
[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)
)]
Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

@@ -1,35 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UseWPF>true</UseWPF>
<Platforms>x64</Platforms>
<AssetTargetFallback>uap10.0.19041</AssetTargetFallback>
<StartupObject>NotificationFlyoutSample.Host.Program</StartupObject>
<EnableTypeInfoReflection>false</EnableTypeInfoReflection>
<EnableXBindDiagnostics>false</EnableXBindDiagnostics>
</PropertyGroup>
<ItemGroup>
<None Remove="Assets\Icon-Light.ico" />
<None Remove="Assets\Icon.ico" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Toolkit.Wpf.UI.XamlHost" Version="6.1.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\src\NotificationFlyout.Uwp.UI.Controls\NotificationFlyout.Uwp.UI.Controls.csproj" />
<ProjectReference Include="..\..\..\src\NotificationFlyout.Wpf.UI.Controls\NotificationFlyout.Wpf.UI.Controls.csproj" />
<ProjectReference Include="..\..\..\src\NotificationFlyout.Wpf.UI\NotificationFlyout.Wpf.UI.csproj" />
<ProjectReference Include="..\NotificationFlyoutSample\NotificationFlyoutSample.csproj" />
</ItemGroup>
<ItemGroup>
<Resource Include="Assets\Icon-Light.ico" />
<Resource Include="Assets\Icon.ico" />
</ItemGroup>
</Project>
@@ -120,11 +120,11 @@
<DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Shell.xaml.cs">
<DependentUpon>Shell.xaml</DependentUpon>
<Compile Include="SampleFlyout.xaml.cs">
<DependentUpon>SampleFlyout.xaml</DependentUpon>
</Compile>
<Compile Include="WindowContent.xaml.cs">
<DependentUpon>WindowContent.xaml</DependentUpon>
<Compile Include="Test.xaml.cs">
<DependentUpon>Test.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
@@ -133,8 +133,6 @@
</AppxManifest>
</ItemGroup>
<ItemGroup>
<Content Include="Assets\Icon-Light.ico" />
<Content Include="Assets\Icon.ico" />
<Content Include="Properties\Default.rd.xml" />
<Content Include="Assets\LockScreenLogo.scale-200.png" />
<Content Include="Assets\SplashScreen.scale-200.png" />
@@ -152,7 +150,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
<Version>6.2.11</Version>
<Version>6.2.12</Version>
</PackageReference>
<PackageReference Include="Microsoft.Toolkit.Win32.UI.XamlApplication">
<Version>6.1.2</Version>
@@ -162,24 +160,24 @@
</PackageReference>
</ItemGroup>
<ItemGroup>
<Page Include="Shell.xaml">
<SubType>Designer</SubType>
<Page Include="SampleFlyout.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="WindowContent.xaml">
<Page Include="Test.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\NotificationFlyout.Uwp.UI.Controls\NotificationFlyout.Uwp.UI.Controls.csproj">
<Project>{95f851e4-87a5-4bb7-953e-c0fe3b306f0e}</Project>
<Name>NotificationFlyout.Uwp.UI.Controls</Name>
</ProjectReference>
<ProjectReference Include="..\..\src\NotificationFlyout.Uwp.UI\NotificationFlyout.Uwp.UI.csproj">
<Project>{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}</Project>
<Name>NotificationFlyout.Uwp.UI</Name>
</ProjectReference>
<Reference Include="TheXamlGuy.NotificationFlyout.Shared.UI, Version=0.0.0.0, Culture=neutral, processorArchitecture=AMD64">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\src\TheXamlGuy.NotificationFlyout.Shared.UI\bin\x64\Release\uap10.0.19041\TheXamlGuy.NotificationFlyout.Shared.UI.dll</HintPath>
</Reference>
<Reference Include="TheXamlGuy.NotificationFlyout.Uwp.UI.Controls, Version=1.0.0.0, Culture=neutral, processorArchitecture=AMD64">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\src\TheXamlGuy.NotificationFlyout.Uwp.UI.Controls\bin\x64\Release\uap10.0.19041\TheXamlGuy.NotificationFlyout.Uwp.UI.Controls.dll</HintPath>
</Reference>
</ItemGroup>
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
<VisualStudioVersion>14.0</VisualStudioVersion>
@@ -196,5 +194,6 @@
<EnableTypeInfoReflection>false</EnableTypeInfoReflection>
<EnableXBindDiagnostics>false</EnableXBindDiagnostics>
<MSBuildWarningsAsMessages>CS8305</MSBuildWarningsAsMessages>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
</Project>
@@ -3,22 +3,24 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30914.41
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyoutSample.Host", "NotificationFlyoutSample.Host\NotificationFlyoutSample.Host.csproj", "{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotificationFlyoutSample", "NotificationFlyoutSample\NotificationFlyoutSample.csproj", "{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{1E895953-2231-4ACA-84A6-64F8F57FE86A}"
ProjectSection(SolutionItems) = preProject
global.json = global.json
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyout.Uwp.UI.Controls", "..\..\src\NotificationFlyout.Uwp.UI.Controls\NotificationFlyout.Uwp.UI.Controls.csproj", "{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TheXamlGuy.NotificationFlyout.Common", "..\..\src\TheXamlGuy.NotificationFlyout.Common\TheXamlGuy.NotificationFlyout.Common.csproj", "{C59F605A-7AAF-43E5-A312-85B9771F2FE4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyout.Wpf.UI", "..\..\src\NotificationFlyout.Wpf.UI\NotificationFlyout.Wpf.UI.csproj", "{49BCC188-22D2-468B-89EA-99C810BE790E}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TheXamlGuy.NotificationFlyout.Shared.UI", "..\..\src\TheXamlGuy.NotificationFlyout.Shared.UI\TheXamlGuy.NotificationFlyout.Shared.UI.csproj", "{E313D2F7-6515-4B8E-8F81-7E886E866853}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyout.Wpf.UI.Controls", "..\..\src\NotificationFlyout.Wpf.UI.Controls\NotificationFlyout.Wpf.UI.Controls.csproj", "{094A2030-C430-490B-AB26-205385A0D4BF}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TheXamlGuy.NotificationFlyout.Uwp.UI.Controls", "..\..\src\TheXamlGuy.NotificationFlyout.Uwp.UI.Controls\TheXamlGuy.NotificationFlyout.Uwp.UI.Controls.csproj", "{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyout.Uwp.UI", "..\..\src\NotificationFlyout.Uwp.UI\NotificationFlyout.Uwp.UI.csproj", "{ADE190A2-F751-4836-B8F4-BF56694A4B3F}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TheXamlGuy.NotificationFlyout.Wpf.UI", "..\..\src\TheXamlGuy.NotificationFlyout.Wpf.UI\TheXamlGuy.NotificationFlyout.Wpf.UI.csproj", "{4FBDACA8-7A79-40E4-A20D-30139A37C680}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TheXamlGuy.NotificationFlyout.Wpf.UI.Controls", "..\..\src\TheXamlGuy.NotificationFlyout.Wpf.UI.Controls\TheXamlGuy.NotificationFlyout.Wpf.UI.Controls.csproj", "{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotificationFlyoutSample", "NotificationFlyoutSample.csproj", "{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyoutSample.Launcher", "..\NotificationFlyoutSample.Launcher\NotificationFlyoutSample.Launcher.csproj", "{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -34,28 +36,107 @@ Global
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|Any CPU.ActiveCfg = Debug|x64
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|Any CPU.Build.0 = Debug|x64
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|ARM.ActiveCfg = Debug|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|ARM.Build.0 = Debug|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|ARM64.Build.0 = Debug|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|x64.ActiveCfg = Debug|x64
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|x64.Build.0 = Debug|x64
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|x86.ActiveCfg = Debug|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Debug|x86.Build.0 = Debug|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|Any CPU.Build.0 = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|ARM.ActiveCfg = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|ARM.Build.0 = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|ARM64.ActiveCfg = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|ARM64.Build.0 = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|x64.ActiveCfg = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|x64.Build.0 = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|x86.ActiveCfg = Release|Any CPU
{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}.Release|x86.Build.0 = Release|Any CPU
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Debug|Any CPU.ActiveCfg = Debug|x64
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Debug|Any CPU.Build.0 = Debug|x64
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Debug|ARM.ActiveCfg = Debug|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Debug|ARM.Build.0 = Debug|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Debug|ARM64.Build.0 = Debug|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Debug|x64.ActiveCfg = Debug|x64
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Debug|x64.Build.0 = Debug|x64
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Debug|x86.ActiveCfg = Debug|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Debug|x86.Build.0 = Debug|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Release|Any CPU.Build.0 = Release|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Release|ARM.ActiveCfg = Release|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Release|ARM.Build.0 = Release|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Release|ARM64.ActiveCfg = Release|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Release|ARM64.Build.0 = Release|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Release|x64.ActiveCfg = Release|x64
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Release|x64.Build.0 = Release|x64
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Release|x86.ActiveCfg = Release|Any CPU
{C59F605A-7AAF-43E5-A312-85B9771F2FE4}.Release|x86.Build.0 = Release|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Debug|ARM.ActiveCfg = Debug|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Debug|ARM.Build.0 = Debug|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Debug|ARM64.Build.0 = Debug|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Debug|x64.ActiveCfg = Debug|x64
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Debug|x64.Build.0 = Debug|x64
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Debug|x86.ActiveCfg = Debug|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Debug|x86.Build.0 = Debug|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Release|Any CPU.Build.0 = Release|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Release|ARM.ActiveCfg = Release|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Release|ARM.Build.0 = Release|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Release|ARM64.ActiveCfg = Release|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Release|ARM64.Build.0 = Release|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Release|x64.ActiveCfg = Release|x64
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Release|x64.Build.0 = Release|x64
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Release|x86.ActiveCfg = Release|Any CPU
{E313D2F7-6515-4B8E-8F81-7E886E866853}.Release|x86.Build.0 = Release|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Debug|ARM.ActiveCfg = Debug|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Debug|ARM.Build.0 = Debug|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Debug|ARM64.Build.0 = Debug|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Debug|x64.ActiveCfg = Debug|x64
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Debug|x64.Build.0 = Debug|x64
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Debug|x86.ActiveCfg = Debug|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Debug|x86.Build.0 = Debug|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Release|Any CPU.Build.0 = Release|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Release|ARM.ActiveCfg = Release|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Release|ARM.Build.0 = Release|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Release|ARM64.ActiveCfg = Release|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Release|ARM64.Build.0 = Release|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Release|x64.ActiveCfg = Release|x64
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Release|x64.Build.0 = Release|x64
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Release|x86.ActiveCfg = Release|Any CPU
{A970D11A-AD9F-4A3F-A509-16FA5F9AC779}.Release|x86.Build.0 = Release|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Debug|ARM.ActiveCfg = Debug|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Debug|ARM.Build.0 = Debug|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Debug|ARM64.Build.0 = Debug|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Debug|x64.ActiveCfg = Debug|x64
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Debug|x64.Build.0 = Debug|x64
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Debug|x86.ActiveCfg = Debug|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Debug|x86.Build.0 = Debug|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Release|Any CPU.Build.0 = Release|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Release|ARM.ActiveCfg = Release|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Release|ARM.Build.0 = Release|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Release|ARM64.ActiveCfg = Release|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Release|ARM64.Build.0 = Release|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Release|x64.ActiveCfg = Release|x64
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Release|x64.Build.0 = Release|x64
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Release|x86.ActiveCfg = Release|Any CPU
{4FBDACA8-7A79-40E4-A20D-30139A37C680}.Release|x86.Build.0 = Release|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Debug|ARM.ActiveCfg = Debug|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Debug|ARM.Build.0 = Debug|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Debug|ARM64.Build.0 = Debug|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Debug|x64.ActiveCfg = Debug|x64
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Debug|x64.Build.0 = Debug|x64
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Debug|x86.ActiveCfg = Debug|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Debug|x86.Build.0 = Debug|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Release|Any CPU.Build.0 = Release|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Release|ARM.ActiveCfg = Release|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Release|ARM.Build.0 = Release|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Release|ARM64.ActiveCfg = Release|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Release|ARM64.Build.0 = Release|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Release|x64.ActiveCfg = Release|x64
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Release|x64.Build.0 = Release|x64
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Release|x86.ActiveCfg = Release|Any CPU
{0AB1D328-BBB0-434B-965A-48ACDB6CBFB7}.Release|x86.Build.0 = Release|Any CPU
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Debug|Any CPU.ActiveCfg = Debug|x86
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Debug|ARM.ActiveCfg = Debug|ARM
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Debug|ARM.Build.0 = Debug|ARM
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Debug|ARM.Deploy.0 = Debug|ARM
@@ -81,86 +162,26 @@ Global
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Release|x86.ActiveCfg = Release|x86
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Release|x86.Build.0 = Release|x86
{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}.Release|x86.Deploy.0 = Release|x86
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|ARM.ActiveCfg = Debug|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|ARM.Build.0 = Debug|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|ARM64.Build.0 = Debug|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|x64.ActiveCfg = Debug|x64
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|x64.Build.0 = Debug|x64
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|x86.ActiveCfg = Debug|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Debug|x86.Build.0 = Debug|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|Any CPU.Build.0 = Release|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|ARM.ActiveCfg = Release|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|ARM.Build.0 = Release|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|ARM64.ActiveCfg = Release|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|ARM64.Build.0 = Release|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|x64.ActiveCfg = Release|x64
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|x64.Build.0 = Release|x64
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|x86.ActiveCfg = Release|Any CPU
{95F851E4-87A5-4BB7-953E-C0FE3B306F0E}.Release|x86.Build.0 = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|ARM.ActiveCfg = Debug|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|ARM.Build.0 = Debug|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|ARM64.Build.0 = Debug|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|x64.ActiveCfg = Debug|x64
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|x64.Build.0 = Debug|x64
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|x86.ActiveCfg = Debug|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Debug|x86.Build.0 = Debug|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|Any CPU.Build.0 = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|ARM.ActiveCfg = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|ARM.Build.0 = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|ARM64.ActiveCfg = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|ARM64.Build.0 = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|x64.ActiveCfg = Release|x64
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|x64.Build.0 = Release|x64
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|x86.ActiveCfg = Release|Any CPU
{49BCC188-22D2-468B-89EA-99C810BE790E}.Release|x86.Build.0 = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|ARM.ActiveCfg = Debug|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|ARM.Build.0 = Debug|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|ARM64.Build.0 = Debug|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|x64.ActiveCfg = Debug|x64
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|x64.Build.0 = Debug|x64
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|x86.ActiveCfg = Debug|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Debug|x86.Build.0 = Debug|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|Any CPU.Build.0 = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|ARM.ActiveCfg = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|ARM.Build.0 = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|ARM64.ActiveCfg = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|ARM64.Build.0 = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|x64.ActiveCfg = Release|x64
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|x64.Build.0 = Release|x64
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|x86.ActiveCfg = Release|Any CPU
{094A2030-C430-490B-AB26-205385A0D4BF}.Release|x86.Build.0 = Release|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Debug|ARM.ActiveCfg = Debug|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Debug|ARM.Build.0 = Debug|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Debug|ARM64.Build.0 = Debug|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Debug|x64.ActiveCfg = Debug|x64
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Debug|x64.Build.0 = Debug|x64
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Debug|x86.ActiveCfg = Debug|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Debug|x86.Build.0 = Debug|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Release|Any CPU.Build.0 = Release|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Release|ARM.ActiveCfg = Release|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Release|ARM.Build.0 = Release|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Release|ARM64.ActiveCfg = Release|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Release|ARM64.Build.0 = Release|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Release|x64.ActiveCfg = Release|x64
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Release|x64.Build.0 = Release|x64
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Release|x86.ActiveCfg = Release|Any CPU
{ADE190A2-F751-4836-B8F4-BF56694A4B3F}.Release|x86.Build.0 = Release|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Debug|ARM.ActiveCfg = Debug|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Debug|ARM.Build.0 = Debug|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Debug|ARM64.Build.0 = Debug|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Debug|x64.ActiveCfg = Debug|x64
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Debug|x64.Build.0 = Debug|x64
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Debug|x86.ActiveCfg = Debug|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Debug|x86.Build.0 = Debug|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Release|Any CPU.Build.0 = Release|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Release|ARM.ActiveCfg = Release|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Release|ARM.Build.0 = Release|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Release|ARM64.ActiveCfg = Release|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Release|ARM64.Build.0 = Release|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Release|x64.ActiveCfg = Release|x64
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Release|x64.Build.0 = Release|x64
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Release|x86.ActiveCfg = Release|Any CPU
{DB86CC51-8AA1-46A4-B382-B05DE08E0FF6}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1,9 +0,0 @@
<xamlhost:XamlApplication
x:Class="NotificationFlyoutSample.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:xamlhost="using:Microsoft.Toolkit.Win32.UI.XamlHost">
<xamlhost:XamlApplication.Resources>
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
</xamlhost:XamlApplication.Resources>
</xamlhost:XamlApplication>
@@ -1,12 +0,0 @@
using Microsoft.Toolkit.Win32.UI.XamlHost;
namespace NotificationFlyoutSample
{
public sealed partial class App : XamlApplication
{
public App()
{
Initialize();
}
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

@@ -1,192 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProjectGuid>{2057ADE0-C61E-45EE-BB7E-A469FE4D4C41}</ProjectGuid>
<OutputType>AppContainerExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NotificationFlyoutSample</RootNamespace>
<AssemblyName>NotificationFlyoutSample</AssemblyName>
<DefaultLanguage>en-US</DefaultLanguage>
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
<TargetPlatformVersion Condition=" '$(TargetPlatformVersion)' == '' ">10.0.19041.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.19041.0</TargetPlatformMinVersion>
<MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WindowsXamlEnableOverview>true</WindowsXamlEnableOverview>
<AppxPackageSigningEnabled>false</AppxPackageSigningEnabled>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\ARM\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
<OutputPath>bin\ARM\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\ARM64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>ARM64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM64'">
<OutputPath>bin\ARM64\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>ARM64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
</PropertyGroup>
<ItemGroup>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Shell.xaml.cs">
<DependentUpon>Shell.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<AppxManifest Include="Package.appxmanifest">
<SubType>Designer</SubType>
</AppxManifest>
</ItemGroup>
<ItemGroup>
<Content Include="Assets\Icon-Light.ico" />
<Content Include="Assets\Icon.ico" />
<Content Include="Properties\Default.rd.xml" />
<Content Include="Assets\LockScreenLogo.scale-200.png" />
<Content Include="Assets\SplashScreen.scale-200.png" />
<Content Include="Assets\Square150x150Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />
<Content Include="Assets\StoreLogo.png" />
<Content Include="Assets\Wide310x150Logo.scale-200.png" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
<Version>6.2.11</Version>
</PackageReference>
<PackageReference Include="Microsoft.Toolkit.Win32.UI.XamlApplication">
<Version>6.1.2</Version>
</PackageReference>
<PackageReference Include="Microsoft.UI.Xaml">
<Version>2.6.0-prerelease.210113001</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>
<Page Include="Shell.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\src\NotificationFlyout.Uwp.UI.Controls\NotificationFlyout.Uwp.UI.Controls.csproj">
<Project>{95f851e4-87a5-4bb7-953e-c0fe3b306f0e}</Project>
<Name>NotificationFlyout.Uwp.UI.Controls</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\src\NotificationFlyout.Uwp.UI\NotificationFlyout.Uwp.UI.csproj">
<Project>{ade190a2-f751-4836-b8f4-bf56694a4b3f}</Project>
<Name>NotificationFlyout.Uwp.UI</Name>
</ProjectReference>
</ItemGroup>
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
<VisualStudioVersion>14.0</VisualStudioVersion>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.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>
-->
<PropertyGroup>
<EnableTypeInfoReflection>false</EnableTypeInfoReflection>
<EnableXBindDiagnostics>false</EnableXBindDiagnostics>
</PropertyGroup>
</Project>
@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
IgnorableNamespaces="uap mp">
<Identity
Name="463d679e-a359-426e-9d28-ecf319559f65"
Publisher="CN=dan"
Version="1.0.0.0" />
<mp:PhoneIdentity PhoneProductId="463d679e-a359-426e-9d28-ecf319559f65" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
<Properties>
<DisplayName>NotificationFlyoutSample</DisplayName>
<PublisherDisplayName>dan</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate"/>
</Resources>
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="NotificationFlyoutSample.App">
<uap:VisualElements
DisplayName="NotificationFlyoutSample"
Square150x150Logo="Assets\Square150x150Logo.png"
Square44x44Logo="Assets\Square44x44Logo.png"
Description="NotificationFlyoutSample"
BackgroundColor="transparent">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png"/>
<uap:SplashScreen Image="Assets\SplashScreen.png" />
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient" />
</Capabilities>
</Package>
@@ -1,29 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 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("NotificationFlyoutSample")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NotificationFlyoutSample")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 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")]
[assembly: ComVisible(false)]
@@ -1,31 +0,0 @@
<!--
This file contains Runtime Directives used by .NET Native. The defaults here are suitable for most
developers. However, you can modify these parameters to modify the behavior of the .NET Native
optimizer.
Runtime Directives are documented at https://go.microsoft.com/fwlink/?LinkID=391919
To fully enable reflection for App1.MyClass and all of its public/private members
<Type Name="App1.MyClass" Dynamic="Required All"/>
To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32
<TypeInstantiation Name="App1.AppClass" Arguments="System.Int32" Activate="Required Public" />
Using the Namespace directive to apply reflection policy to all the types in a particular namespace
<Namespace Name="DataClasses.ViewModels" Serialize="All" />
-->
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<!--
An Assembly element with Name="*Application*" applies to all assemblies in
the application package. The asterisks are not wildcards.
-->
<Assembly Name="*Application*" Dynamic="Required All" />
<!-- Add your application specific runtime directives here. -->
</Application>
</Directives>
@@ -1,87 +0,0 @@
<controls:NotificationFlyout
x:Class="NotificationFlyoutSample.Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:NotificationFlyout.Uwp.UI.Controls"
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
IconSource="/Assets/Icon.ico"
LightIconSource="/Assets/Icon-Light.ico">
<controls:NotificationFlyout.ContextMenuItems>
<MenuFlyoutItem Click="MenuFlyoutItem_Click" Text="Click me" />
<MenuFlyoutItem Click="MenuFlyoutItem_Click_1" Text="Exit" />
</controls:NotificationFlyout.ContextMenuItems>
<StackPanel Margin="24">
<ComboBox
x:Name="Theme"
Margin="0,0,0,8"
SelectionChanged="Theme_SelectionChanged">
<ComboBoxItem Content="Default" />
<ComboBoxItem Content="Dark" />
<ComboBoxItem Content="Light" />
</ComboBox>
<muxc:MenuBar>
<muxc:MenuBarItem Title="File">
<MenuFlyoutItem Text="New" />
<MenuFlyoutItem Text="Open..." />
<MenuFlyoutItem Text="Save" />
<MenuFlyoutItem Text="Exit" />
</muxc:MenuBarItem>
<muxc:MenuBarItem Title="Edit">
<MenuFlyoutItem Text="Undo" />
<MenuFlyoutItem Text="Cut" />
<MenuFlyoutItem Text="Copy" />
<MenuFlyoutItem Text="Paste" />
</muxc:MenuBarItem>
<muxc:MenuBarItem Title="Help">
<MenuFlyoutItem Text="About" />
</muxc:MenuBarItem>
</muxc:MenuBar>
<muxc:ProgressRing Margin="0,0,0,8" IsActive="True" />
<muxc:ProgressBar
Width="130"
Margin="0,0,0,8"
IsIndeterminate="True"
ShowError="False"
ShowPaused="False" />
<Button Margin="0,0,0,8" Content="Button" />
<Slider Margin="0,0,0,8" />
<TextBox Margin="0,0,0,8" />
<CalendarView Margin="0,0,0,8" />
<TimePicker Margin="0,0,0,8" />
<DatePicker />
<muxc:NumberBox
x:Name="NumberBoxSpinButtonPlacementExample"
Header="Enter an integer:"
LargeChange="100"
SmallChange="10"
SpinButtonPlacementMode="Compact"
Value="1" />
<muxc:RadioButtons Header="Options:">
<RadioButton Content="Option 1" />
<RadioButton Content="Option 2" />
<RadioButton Content="Option 3" />
</muxc:RadioButtons>
<StackPanel>
<CheckBox
x:Name="OptionsAllCheckBox"
Content="Select all"
IsThreeState="True" />
<CheckBox
x:Name="Option1CheckBox"
Margin="24,0,0,0"
Content="Option 1" />
<CheckBox
x:Name="Option2CheckBox"
Margin="24,0,0,0"
Content="Option 2"
IsChecked="True" />
<CheckBox
x:Name="Option3CheckBox"
Margin="24,0,0,0"
Content="Option 3" />
</StackPanel>
<muxc:RatingControl AutomationProperties.Name="RatingControl with placeholder" PlaceholderValue="0" />
</StackPanel>
</controls:NotificationFlyout>
@@ -1,41 +0,0 @@
using Windows.UI.Popups;
using Windows.UI.Xaml;
namespace NotificationFlyoutSample
{
public sealed partial class Shell
{
public Shell()
{
InitializeComponent();
}
private void Theme_SelectionChanged(object sender, Windows.UI.Xaml.Controls.SelectionChangedEventArgs e)
{
switch (Theme.SelectedIndex)
{
case 0:
RequestedTheme = Windows.UI.Xaml.ElementTheme.Default;
break;
case 1:
RequestedTheme = Windows.UI.Xaml.ElementTheme.Dark;
break;
case 2:
RequestedTheme = Windows.UI.Xaml.ElementTheme.Light;
break;
}
}
private void MenuFlyoutItem_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
MessageDialog d = new MessageDialog("Hello from context menu!");
d.ShowAsync();
}
private void MenuFlyoutItem_Click_1(object sender, RoutedEventArgs e)
{
var app = GetApplication();
app.Exit();
}
}
}
@@ -1,5 +1,4 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
@@ -6,7 +6,7 @@
Runtime Directives are documented at https://go.microsoft.com/fwlink/?LinkID=391919
To fully enable reflection for App1.MyClass and all of its public/private members
<Type Name="App1.MyClass" Dynamic="Required All"/>
<Type Name="App1.MyClass" Dynamic="Required All" />
To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32
<TypeInstantiation Name="App1.AppClass" Arguments="System.Int32" Activate="Required Public" />
@@ -23,9 +23,6 @@
-->
<Assembly Name="*Application*" Dynamic="Required All" />
<!-- Add your application specific runtime directives here. -->
</Application>
</Directives>
@@ -0,0 +1,33 @@
<controls:NotificationFlyout
x:Class="NotificationFlyoutSample.SampleFlyout"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:TheXamlGuy.NotificationFlyout.Uwp.UI.Controls"
VerticalContentAlignment="Top">
<controls:NotificationFlyout.ContextFlyout>
<MenuFlyout>
<MenuFlyoutItem Click="OnCloseMenuFlyoutItemClick" Text="Close" />
</MenuFlyout>
</controls:NotificationFlyout.ContextFlyout>
<Grid Margin="24" VerticalAlignment="Top">
<StackPanel Background="Red">
<ToggleSwitch
Header="Is light dimissed enabled"
IsOn="True"
OffContent="False"
OnContent="True"
Toggled="ToggleSwitch_Toggled" />
<ComboBox Header="Placement" SelectionChanged="ComboBox_SelectionChanged">
<ComboBoxItem Content="Auto" />
<ComboBoxItem Content="FullRight" />
</ComboBox>
<Slider />
<TextBox />
<CalendarDatePicker />
<CalendarView />
<Button Click="Button_Click" Content="hello" />
<TimePicker />
</StackPanel>
</Grid>
</controls:NotificationFlyout>
@@ -0,0 +1,53 @@
using TheXamlGuy.NotificationFlyout.Uwp.UI.Controls;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace NotificationFlyoutSample
{
public sealed partial class SampleFlyout
{
public SampleFlyout()
{
InitializeComponent();
}
private void OnCloseMenuFlyoutItemClick(object sender, RoutedEventArgs args)
{
var app = GetApplication();
app.Exit();
}
private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e)
{
var toggleSwitch = sender as ToggleSwitch;
if (toggleSwitch.IsOn)
{
this.IsLightDismissEnabled = true;
}
else
{
this.IsLightDismissEnabled = false;
}
}
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var comboBox = sender as ComboBox;
if (comboBox.SelectedIndex == 0)
{
this.Placement = NotificationFlyoutPlacement.Auto;
}
else
{
this.Placement = NotificationFlyoutPlacement.FullRight;
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var app = GetApplication();
app.OpenAsWindow<Test>();
}
}
}
@@ -1,86 +0,0 @@
<controls:NotificationFlyout
x:Class="NotificationFlyoutSample.Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:NotificationFlyout.Uwp.UI.Controls"
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
IconSource="/Assets/Icon.ico"
LightIconSource="/Assets/Icon-Light.ico">
<controls:NotificationFlyout.ContextMenuItems>
<MenuFlyoutItem Click="MenuFlyoutItem_Click" Text="Close" />
</controls:NotificationFlyout.ContextMenuItems>
<StackPanel Margin="24">
<ComboBox
x:Name="Theme"
Margin="0,0,0,8"
SelectionChanged="Theme_SelectionChanged">
<ComboBoxItem Content="Default" />
<ComboBoxItem Content="Dark" />
<ComboBoxItem Content="Light" />
</ComboBox>
<muxc:MenuBar>
<muxc:MenuBarItem Title="File">
<MenuFlyoutItem Text="New" />
<MenuFlyoutItem Text="Open..." />
<MenuFlyoutItem Text="Save" />
<MenuFlyoutItem Text="Exit" />
</muxc:MenuBarItem>
<muxc:MenuBarItem Title="Edit">
<MenuFlyoutItem Text="Undo" />
<MenuFlyoutItem Text="Cut" />
<MenuFlyoutItem Text="Copy" />
<MenuFlyoutItem Text="Paste" />
</muxc:MenuBarItem>
<muxc:MenuBarItem Title="Help">
<MenuFlyoutItem Text="About" />
</muxc:MenuBarItem>
</muxc:MenuBar>
<muxc:ProgressRing Margin="0,0,0,8" IsActive="True" />
<muxc:ProgressBar
Width="130"
Margin="0,0,0,8"
IsIndeterminate="True"
ShowError="False"
ShowPaused="False" />
<Button Margin="0,0,0,8" Content="Open window" Click="Button_Click" />
<Slider Margin="0,0,0,8" />
<TextBox Margin="0,0,0,8" />
<CalendarView Margin="0,0,0,8" />
<TimePicker Margin="0,0,0,8" />
<DatePicker />
<muxc:NumberBox
x:Name="NumberBoxSpinButtonPlacementExample"
Header="Enter an integer:"
LargeChange="100"
SmallChange="10"
SpinButtonPlacementMode="Compact"
Value="1" />
<muxc:RadioButtons Header="Options:">
<RadioButton Content="Option 1" />
<RadioButton Content="Option 2" />
<RadioButton Content="Option 3" />
</muxc:RadioButtons>
<StackPanel>
<CheckBox
x:Name="OptionsAllCheckBox"
Content="Select all"
IsThreeState="True" />
<CheckBox
x:Name="Option1CheckBox"
Margin="24,0,0,0"
Content="Option 1" />
<CheckBox
x:Name="Option2CheckBox"
Margin="24,0,0,0"
Content="Option 2"
IsChecked="True" />
<CheckBox
x:Name="Option3CheckBox"
Margin="24,0,0,0"
Content="Option 3" />
</StackPanel>
<muxc:RatingControl AutomationProperties.Name="RatingControl with placeholder" PlaceholderValue="0" />
</StackPanel>
</controls:NotificationFlyout>
@@ -1,38 +0,0 @@
namespace NotificationFlyoutSample
{
public sealed partial class Shell
{
public Shell()
{
InitializeComponent();
}
private void Theme_SelectionChanged(object sender, Windows.UI.Xaml.Controls.SelectionChangedEventArgs e)
{
switch (Theme.SelectedIndex)
{
case 0:
RequestedTheme = Windows.UI.Xaml.ElementTheme.Default;
break;
case 1:
RequestedTheme = Windows.UI.Xaml.ElementTheme.Dark;
break;
case 2:
RequestedTheme = Windows.UI.Xaml.ElementTheme.Light;
break;
}
}
private void MenuFlyoutItem_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
var app = GetApplication();
app.Exit();
}
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
var app = GetApplication();
app.OpenAsWindow<WindowContent>();
}
}
}
@@ -0,0 +1,25 @@
<UserControl
x:Class="NotificationFlyoutSample.Test"
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:local="using:NotificationFlyoutSample"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
d:DesignHeight="300"
d:DesignWidth="400"
mc:Ignorable="d">
<Grid>
<Button Click="TestButtonClick1" Content="Show TeachingTip" />
<muxc:TeachingTip x:Name="ToggleThemeTeachingTip1" ShouldConstrainToRootBounds="False">
<muxc:TeachingTip.Content>
<Border Width="500" Height="500">
<Slider />
</Border>
</muxc:TeachingTip.Content>
</muxc:TeachingTip>
</Grid>
</UserControl>
@@ -17,11 +17,17 @@ using Windows.UI.Xaml.Navigation;
namespace NotificationFlyoutSample
{
public sealed partial class WindowContent : UserControl
public sealed partial class Test : UserControl
{
public WindowContent()
public Test()
{
this.InitializeComponent();
}
private void TestButtonClick1(object sender, RoutedEventArgs e)
{
ToggleThemeTeachingTip1.XamlRoot = this.XamlRoot;
ToggleThemeTeachingTip1.IsOpen = true;
}
}
}
@@ -1,27 +0,0 @@
<UserControl
x:Class="NotificationFlyoutSample.WindowContent"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:muxc="using:Microsoft.UI.Xaml.Controls">
<muxc:NavigationView x:Name="nvSample">
<muxc:NavigationView.MenuItems>
<muxc:NavigationViewItem
Content="Menu Item1"
Icon="Play"
Tag="SamplePage1" />
<muxc:NavigationViewItem
Content="Menu Item2"
Icon="Save"
Tag="SamplePage2" />
<muxc:NavigationViewItem
Content="Menu Item3"
Icon="Refresh"
Tag="SamplePage3" />
<muxc:NavigationViewItem
Content="Menu Item4"
Icon="Download"
Tag="SamplePage4" />
</muxc:NavigationView.MenuItems>
<Frame x:Name="contentFrame" />
</muxc:NavigationView>
</UserControl>
@@ -1,55 +0,0 @@
using System.Collections.Generic;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
namespace NotificationFlyout.Uwp.UI.Controls
{
internal class ContextMenuFlyoutHost : Control
{
private MenuFlyout _flyout;
private Grid _root;
public ContextMenuFlyoutHost()
{
DefaultStyleKey = typeof(ContextMenuFlyoutHost);
}
public void HideFlyout()
{
if (_flyout == null) return;
_flyout.Hide();
}
public void ShowFlyout()
{
if (_root == null) return;
if (_flyout == null) return;
_flyout.ShowAt(_root, new FlyoutShowOptions { Placement = FlyoutPlacementMode.BottomEdgeAlignedLeft, ShowMode = FlyoutShowMode.TransientWithDismissOnPointerMoveAway });
}
protected override void OnApplyTemplate()
{
_root = GetTemplateChild("Root") as Grid;
_flyout = GetTemplateChild("Flyout") as MenuFlyout;
}
internal void SetMenuItems(IList<MenuFlyoutItemBase> addedItems, IList<MenuFlyoutItemBase> removedItems = null)
{
if (_flyout == null) return;
if (removedItems != null)
{
foreach (var item in removedItems)
{
_flyout.Items.Remove(item);
}
}
foreach (var item in addedItems)
{
_flyout.Items.Add(item);
}
}
}
}
@@ -1,18 +0,0 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:NotificationFlyout.Uwp.UI.Controls">
<Style TargetType="controls:ContextMenuFlyoutHost">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controls:ContextMenuFlyoutHost">
<Grid x:Name="Root">
<FlyoutBase.AttachedFlyout>
<MenuFlyout x:Name="Flyout" />
</FlyoutBase.AttachedFlyout>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
@@ -1,150 +0,0 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Markup;
using Windows.UI.Xaml.Media;
namespace NotificationFlyout.Uwp.UI.Controls
{
[ContentProperty(Name = "Content")]
public class NotificationFlyout : DependencyObject
{
public static readonly DependencyProperty IconSourceProperty =
DependencyProperty.Register(nameof(IconSource),
typeof(ImageSource), typeof(NotificationFlyout),
new PropertyMetadata(null, OnIconPropertyChanged));
public static readonly DependencyProperty LightIconSourceProperty =
DependencyProperty.Register(nameof(LightIconSource),
typeof(ImageSource), typeof(NotificationFlyout),
new PropertyMetadata(null, OnIconPropertyChanged));
public static readonly DependencyProperty RequestedThemeProperty =
DependencyProperty.Register(nameof(RequestedTheme),
typeof(ElementTheme), typeof(NotificationFlyout),
new PropertyMetadata(ElementTheme.Default, OnRequestedThemePropertyChanged));
public static INotificationFlyoutApplication _applicationInstance;
public static DependencyProperty ContentProperty =
DependencyProperty.Register(nameof(Content),
typeof(UIElement), typeof(NotificationFlyout),
new PropertyMetadata(null, OnContentPropertyChanged));
public static DependencyProperty ContextMenuItemsProperty =
DependencyProperty.Register(nameof(ContextMenuItems),
typeof(IList<MenuFlyoutItemBase>), typeof(NotificationFlyout),
new PropertyMetadata(null));
public NotificationFlyout()
{
ContextMenuItems = new ObservableCollection<MenuFlyoutItemBase>();
(ContextMenuItems as INotifyCollectionChanged).CollectionChanged += OnContextMenuItemsChanged;
}
internal event EventHandler ContentChanged;
internal event EventHandler IconSourceChanged;
internal event EventHandler<NotificationFlyoutMenuItemsChangedEventArgs> MenuItemsChanged;
internal event EventHandler RequestedThemeChanged;
public UIElement Content
{
get => (UIElement)GetValue(ContentProperty);
set => SetValue(ContentProperty, value);
}
public IList<MenuFlyoutItemBase> ContextMenuItems
{
get => (IList<MenuFlyoutItemBase>)GetValue(ContextMenuItemsProperty);
set => SetValue(ContextMenuItemsProperty, value);
}
public ImageSource IconSource
{
get => (ImageSource)GetValue(IconSourceProperty);
set => SetValue(IconSourceProperty, value);
}
public ImageSource LightIconSource
{
get => (ImageSource)GetValue(LightIconSourceProperty);
set => SetValue(LightIconSourceProperty, value);
}
public ElementTheme RequestedTheme
{
get => (ElementTheme)GetValue(RequestedThemeProperty);
set => SetValue(RequestedThemeProperty, value);
}
public static INotificationFlyoutApplication GetApplication()
{
return _applicationInstance;
}
internal static void SetApplication(INotificationFlyoutApplication application)
{
_applicationInstance = application;
}
private static void OnContentPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
{
var sender = dependencyObject as NotificationFlyout;
sender?.OnContentPropertyChanged();
}
private static void OnIconPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
{
var sender = dependencyObject as NotificationFlyout;
sender?.OnIconPropertyChanged();
}
private static void OnRequestedThemePropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
{
var sender = dependencyObject as NotificationFlyout;
sender?.OnRequestedThemePropertyChanged();
}
private void OnContentPropertyChanged()
{
ContentChanged?.Invoke(this, EventArgs.Empty);
}
private void OnContextMenuItemsChanged(object sender, NotifyCollectionChangedEventArgs args)
{
var addedItems = args.NewItems.Cast<MenuFlyoutItemBase>().ToList();
var removedItems = args.NewItems.Cast<MenuFlyoutItemBase>().ToList();
MenuItemsChanged?.Invoke(this, new NotificationFlyoutMenuItemsChangedEventArgs(addedItems, removedItems));
}
private void OnIconPropertyChanged()
{
IconSourceChanged?.Invoke(this, EventArgs.Empty);
}
private void OnRequestedThemePropertyChanged()
{
RequestedThemeChanged?.Invoke(this, EventArgs.Empty);
}
}
internal class NotificationFlyoutMenuItemsChangedEventArgs : EventArgs
{
public NotificationFlyoutMenuItemsChangedEventArgs(IList<MenuFlyoutItemBase> addedItems, IList<MenuFlyoutItemBase> removedItems)
{
AddedItems = addedItems;
RemovedItems = removedItems;
}
public IList<MenuFlyoutItemBase> AddedItems { get; private set; }
public IList<MenuFlyoutItemBase> RemovedItems { get; private set; }
}
}
@@ -1,76 +0,0 @@
using System.Numerics;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Media;
namespace NotificationFlyout.Uwp.UI.Controls
{
internal class NotificationFlyoutHost : Control
{
public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register(nameof(Content),
typeof(UIElement), typeof(NotificationFlyoutHost),
new PropertyMetadata(null));
private bool _isLoaded;
private string _placement;
private Grid _root;
public NotificationFlyoutHost()
{
DefaultStyleKey = typeof(NotificationFlyoutHost);
}
public UIElement Content
{
get => (UIElement)GetValue(ContentProperty);
set => SetValue(ContentProperty, value);
}
public void HideFlyout()
{
if (_root == null) return;
FlyoutBase flyout = FlyoutBase.GetAttachedFlyout(_root);
flyout.Hide();
}
public void SetFlyoutPlacement(string placement)
{
if (!_isLoaded)
{
_placement = placement;
}
if (string.IsNullOrEmpty(placement)) return;
VisualStateManager.GoToState(this, placement, true);
}
public void ShowFlyout(FlyoutPlacementMode placementMode)
{
if (_root == null) return;
var flyout = FlyoutBase.GetAttachedFlyout(_root);
flyout.ShowAt(_root, new FlyoutShowOptions
{
Placement = placementMode,
ShowMode = FlyoutShowMode.Standard,
});
}
protected override void OnApplyTemplate()
{
_root = GetTemplateChild("Root") as Grid;
if (GetTemplateChild("ContentRoot") is Grid contentRoot)
{
contentRoot.Shadow = new ThemeShadow();
var currentTranslation = contentRoot.Translation;
var translation = new Vector3(currentTranslation.X, currentTranslation.Y, 16.0f);
contentRoot.Translation = translation;
}
_isLoaded = true;
SetFlyoutPlacement(_placement);
}
}
}
@@ -1,98 +0,0 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:NotificationFlyout.Uwp.UI.Controls">
<Style TargetType="controls:NotificationFlyoutHost">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controls:NotificationFlyoutHost">
<Grid x:Name="Root">
<Grid.Resources>
<Style x:Key="DefaultFlyoutPresenterStyle" TargetType="FlyoutPresenter">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="IsDefaultShadowEnabled" Value="False" />
<Setter Property="Padding" Value="0" />
</Style>
<Style
x:Key="TopFlyoutPresenterStyle"
BasedOn="{StaticResource DefaultFlyoutPresenterStyle}"
TargetType="FlyoutPresenter">
<Setter Property="Margin" Value="0,-7,0,0" />
</Style>
<Style
x:Key="BottomFlyoutPresenterStyle"
BasedOn="{StaticResource DefaultFlyoutPresenterStyle}"
TargetType="FlyoutPresenter">
<Setter Property="Margin" Value="0,7,0,0" />
</Style>
<Style
x:Key="LeftFlyoutPresenterStyle"
BasedOn="{StaticResource DefaultFlyoutPresenterStyle}"
TargetType="FlyoutPresenter">
<Setter Property="Margin" Value="-7,0,0,0" />
</Style>
<Style
x:Key="RightFlyoutPresenterStyle"
BasedOn="{StaticResource DefaultFlyoutPresenterStyle}"
TargetType="FlyoutPresenter">
<Setter Property="Margin" Value="7,0,0,0" />
</Style>
</Grid.Resources>
<FlyoutBase.AttachedFlyout>
<Flyout
x:Name="Flyout"
AreOpenCloseAnimationsEnabled="False"
FlyoutPresenterStyle="{StaticResource BottomFlyoutPresenterStyle}"
ShouldConstrainToRootBounds="False">
<Grid x:Name="ContentRoot">
<Grid.Transitions>
<TransitionCollection>
<EntranceThemeTransition
x:Name="EntranceThemeTransition"
FromHorizontalOffset="0"
FromVerticalOffset="0" />
</TransitionCollection>
</Grid.Transitions>
<controls:NotificationFlyoutPresenter Content="{TemplateBinding Content}" />
</Grid>
</Flyout>
</FlyoutBase.AttachedFlyout>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="PlacementStates">
<VisualState x:Name="Bottom">
<VisualState.Setters>
<Setter Target="Flyout.FlyoutPresenterStyle" Value="{StaticResource BottomFlyoutPresenterStyle}" />
<Setter Target="EntranceThemeTransition.FromHorizontalOffset" Value="0" />
<Setter Target="EntranceThemeTransition.FromVerticalOffset" Value="80" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Top">
<VisualState.Setters>
<Setter Target="Flyout.FlyoutPresenterStyle" Value="{StaticResource TopFlyoutPresenterStyle}" />
<Setter Target="EntranceThemeTransition.FromHorizontalOffset" Value="0" />
<Setter Target="EntranceThemeTransition.FromVerticalOffset" Value="-80" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Left">
<VisualState.Setters>
<Setter Target="Flyout.FlyoutPresenterStyle" Value="{StaticResource LeftFlyoutPresenterStyle}" />
<Setter Target="EntranceThemeTransition.FromHorizontalOffset" Value="-80" />
<Setter Target="EntranceThemeTransition.FromVerticalOffset" Value="0" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Right">
<VisualState.Setters>
<Setter Target="Flyout.FlyoutPresenterStyle" Value="{StaticResource RightFlyoutPresenterStyle}" />
<Setter Target="EntranceThemeTransition.FromHorizontalOffset" Value="80" />
<Setter Target="EntranceThemeTransition.FromVerticalOffset" Value="0" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
@@ -1,12 +0,0 @@
using Windows.UI.Xaml.Controls;
namespace NotificationFlyout.Uwp.UI.Controls
{
public class NotificationFlyoutPresenter : ContentControl
{
public NotificationFlyoutPresenter()
{
DefaultStyleKey = typeof(NotificationFlyoutPresenter);
}
}
}
@@ -1,79 +0,0 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:NotificationFlyout.Uwp.UI.Controls">
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Default">
<AcrylicBrush
x:Key="AcrylicBackgroundFillColorBrush"
BackgroundSource="HostBackdrop"
FallbackColor="#2C2C2C"
TintColor="#2C2C2C"
TintOpacity="0.8" />
<StaticResource x:Key="NotificationFlyoutPresenterBackgroundBrush" ResourceKey="AcrylicBackgroundFillColorBrush" />
</ResourceDictionary>
<ResourceDictionary x:Key="Light">
<AcrylicBrush
x:Key="AcrylicBackgroundFillColorBrush"
BackgroundSource="HostBackdrop"
FallbackColor="#F9F9F9"
TintColor="#FCFCFC"
TintOpacity="0.8" />
<StaticResource x:Key="NotificationFlyoutPresenterBackgroundBrush" ResourceKey="AcrylicBackgroundFillColorBrush" />
</ResourceDictionary>
<ResourceDictionary x:Key="HighContrast">
<SolidColorBrush x:Key="NotificationFlyoutPresenterBackgroundBrush" Color="Green" />
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
<AcrylicBrush
x:Key="NotificationFlyoutPresenterBackgroundAccentBrush"
BackgroundSource="HostBackdrop"
FallbackColor="{StaticResource SystemAccentColorDark1}"
TintColor="{StaticResource SystemAccentColorDark1}"
TintOpacity="0.8" />
<Style TargetType="controls:NotificationFlyoutPresenter">
<Setter Property="Background" Value="{ThemeResource NotificationFlyoutPresenterBackgroundBrush}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controls:NotificationFlyoutPresenter">
<Border
x:Name="Root"
Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}"
BackgroundSizing="OuterBorderEdge"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}">
<ScrollViewer
x:Name="ScrollViewer"
AutomationProperties.AccessibilityView="Raw"
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}"
VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}">
<ContentControl
x:Name="ContentPresenter"
Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
ContentTransitions="{TemplateBinding ContentTransitions}" />
</ScrollViewer>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="ThemeStates">
<VisualState x:Name="DefaultTheme" />
<VisualState x:Name="ColorPrevalenceTheme">
<VisualState.Setters>
<Setter Target="Root.Background" Value="{ThemeResource NotificationFlyoutPresenterBackgroundAccentBrush}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
@@ -1,7 +0,0 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ms-appx:///NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/NotificationFlyoutHost.xaml" />
<ResourceDictionary Source="ms-appx:///NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/NotificationFlyoutPresenter.xaml" />
<ResourceDictionary Source="ms-appx:///NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/ContextMenuFlyoutHost.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
@@ -1,2 +0,0 @@
GetSystemMetricsForDpi
GetCurrentPackageFullName
@@ -1,38 +0,0 @@
<Project Sdk="MSBuild.Sdk.Extras">
<PropertyGroup>
<TargetFrameworks>uap10.0.19041</TargetFrameworks>
<Platforms>AnyCPU;x64</Platforms>
<EnableTypeInfoReflection>false</EnableTypeInfoReflection>
<EnableXBindDiagnostics>false</EnableXBindDiagnostics>
<LangVersion>9.0</LangVersion>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<Company>TheXamlGuy</Company>
<Authors>TheXamlGuy</Authors>
<Product>NotificationFlyout</Product>
<Version>1.0.0</Version>
</PropertyGroup>
<ItemGroup>
<Compile Remove="NotificationFlyout\**" />
<EmbeddedResource Remove="NotificationFlyout\**" />
<None Remove="NotificationFlyout\**" />
</ItemGroup>
<ItemGroup>
<None Remove="NativeMethods.txt" />
</ItemGroup>
<ItemGroup>
<AdditionalFiles Include="NativeMethods.txt" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.1.319-beta">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="System.Drawing.Common" Version="5.0.0" />
</ItemGroup>
</Project>
@@ -1,29 +0,0 @@
<Project Sdk="MSBuild.Sdk.Extras">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UseWPF>true</UseWPF>
<AssetTargetFallback>uap10.0.19041</AssetTargetFallback>
<Platforms>AnyCPU;x64</Platforms>
<MSBuildWarningsAsMessages>NU1702</MSBuildWarningsAsMessages>
<Company>TheXamlGuy</Company>
<Authors>TheXamlGuy</Authors>
<Product>NotificationFlyout</Product>
<Version>1.0.0</Version>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Toolkit.Wpf.UI.XamlHost" Version="6.1.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NotificationFlyout.Uwp.UI.Controls\NotificationFlyout.Uwp.UI.Controls.csproj" />
<ProjectReference Include="..\NotificationFlyout.Uwp.UI\NotificationFlyout.Uwp.UI.csproj" />
<ProjectReference Include="..\NotificationFlyout.Wpf.UI\NotificationFlyout.Wpf.UI.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Update="Microsoft.VCRTForwarders.140" Version="1.0.7" />
</ItemGroup>
</Project>
@@ -1,81 +0,0 @@
using NotificationFlyout.Uwp.UI;
using System;
using System.Windows;
using System.Windows.Markup;
namespace NotificationFlyout.Wpf.UI.Controls
{
[ContentProperty(nameof(Flyout))]
public class NotificationFlyoutApplication : DependencyObject, INotificationFlyoutApplication
{
public static DependencyProperty FlyoutProperty =
DependencyProperty.Register(nameof(Flyout),
typeof(Uwp.UI.Controls.NotificationFlyout), typeof(NotificationFlyoutApplication),
new PropertyMetadata(null, OnFlyoutPropertyChanged));
private static NotificationFlyoutApplication _instance;
private readonly ContextMenuXamlHost _contextMenuXamlHost;
private readonly NotificationFlyoutXamlHost _notificationFlyoutXamlHost;
public NotificationFlyoutApplication()
{
_instance = this;
_notificationFlyoutXamlHost = new NotificationFlyoutXamlHost();
_notificationFlyoutXamlHost.ContextMenuRequested += OnContextMenuRequested;
_notificationFlyoutXamlHost.Show();
_contextMenuXamlHost = new ContextMenuXamlHost();
_contextMenuXamlHost.Show();
}
public static INotificationFlyoutApplication Current => _instance;
public Uwp.UI.Controls.NotificationFlyout Flyout
{
get => (Uwp.UI.Controls.NotificationFlyout)GetValue(FlyoutProperty);
set => SetValue(FlyoutProperty, value);
}
public void Exit()
{
_contextMenuXamlHost.Close();
_notificationFlyoutXamlHost.Close();
}
public void HideFlyout()
{
_notificationFlyoutXamlHost.HideFlyout();
}
public void OpenAsWindow<TUIElement>() where TUIElement : Windows.UI.Xaml.UIElement
{
var window = new XamlHost<TUIElement>();
window.Show();
}
public void ShowFlyout()
{
_notificationFlyoutXamlHost.ShowFlyout();
}
private static void OnFlyoutPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
var sender = dependencyObject as NotificationFlyoutApplication;
sender?.OnFlyoutPropertyChanged();
}
private void OnContextMenuRequested(object sender, EventArgs args)
{
_contextMenuXamlHost?.ShowContextMenuFlyout();
}
private void OnFlyoutPropertyChanged()
{
_notificationFlyoutXamlHost?.SetFlyout(Flyout);
_contextMenuXamlHost?.SetFlyout(Flyout);
Uwp.UI.Controls.NotificationFlyout.SetApplication(this);
}
}
}
@@ -1,78 +0,0 @@
using NotificationFlyout.Uwp.UI.Controls;
using NotificationFlyout.Wpf.UI.Extensions;
using NotificationFlyout.Wpf.UI.Helpers;
using System;
using System.Collections.Generic;
using Windows.UI.Xaml.Controls;
namespace NotificationFlyout.Wpf.UI.Controls
{
internal class ContextMenuXamlHost : TransparentXamlHost<ContextMenuFlyoutHost>
{
private Uwp.UI.Controls.NotificationFlyout _flyout;
public ContextMenuXamlHost()
{
Topmost = true;
}
public void SetFlyout(Uwp.UI.Controls.NotificationFlyout flyout)
{
if (_flyout != null)
{
_flyout.MenuItemsChanged -= OnContextMenuItemsChanged;
}
_flyout = flyout;
UpdateMenuItems();
}
public void ShowContextMenuFlyout()
{
var position = CursorHelper.GetPhysicalCursorPos();
this.SetWindowPosition(position.y, position.x, WindowSize, WindowSize);
var flyoutHost = GetHostContent();
if (flyoutHost != null)
{
flyoutHost.ShowFlyout();
}
Activate();
}
protected override void OnContentLoaded()
{
UpdateMenuItems();
}
protected override void OnDeactivated(EventArgs args)
{
var flyoutHost = GetHostContent();
if (flyoutHost != null)
{
flyoutHost.HideFlyout();
}
}
private void OnContextMenuItemsChanged(object sender, NotificationFlyoutMenuItemsChangedEventArgs args)
{
UpdateMenuItems(args.AddedItems, args.RemovedItems);
}
private void UpdateMenuItems()
{
if (_flyout == null) return;
UpdateMenuItems(_flyout.ContextMenuItems);
}
private void UpdateMenuItems(IList<MenuFlyoutItemBase> addedItems, IList<MenuFlyoutItemBase> removedItems = default)
{
var flyoutHost = GetHostContent();
if (flyoutHost != null)
{
flyoutHost.SetMenuItems(addedItems, removedItems);
}
}
}
}
@@ -1,248 +0,0 @@
using NotificationFlyout.Uwp.UI.Controls;
using NotificationFlyout.Uwp.UI.Extensions;
using NotificationFlyout.Wpf.UI.Extensions;
using NotificationFlyout.Wpf.UI.Helpers;
using System;
using System.Windows;
using System.Windows.Input;
using Windows.UI.Xaml.Controls.Primitives;
namespace NotificationFlyout.Wpf.UI.Controls
{
internal class NotificationFlyoutXamlHost : TransparentXamlHost<NotificationFlyoutHost>
{
private const string ShellTrayHandleName = "Shell_TrayWnd";
private Uwp.UI.Controls.NotificationFlyout _flyout;
private NotificationIconHelper _notificationIconHelper;
private SystemPersonalisationHelper _systemPersonalisationHelper;
private TaskbarHelper _taskbarHelper;
internal event EventHandler ContextMenuRequested;
public void SetFlyout(Uwp.UI.Controls.NotificationFlyout flyout)
{
if (_flyout != null)
{
_flyout.ContentChanged -= OnFlyoutContentChanged;
_flyout.IconSourceChanged -= OnFlyoutIconSourceChanged;
_flyout.RequestedThemeChanged -= OnFlyoutIconSourceChanged;
}
_flyout = flyout;
_flyout.ContentChanged += OnFlyoutContentChanged;
_flyout.IconSourceChanged += OnFlyoutIconSourceChanged;
_flyout.RequestedThemeChanged += OnFlyoutRequestedThemeChanged;
UpdateIcons();
UpdateFlyoutContent();
UpdateRequestedTheme();
}
internal void HideFlyout()
{
var flyoutHost = GetHostContent();
if (flyoutHost != null)
{
flyoutHost.HideFlyout();
}
}
internal void ShowFlyout()
{
var flyoutHost = GetHostContent();
if (flyoutHost != null)
{
var taskbarState = _taskbarHelper.GetCurrentState();
var flyoutPlacement = taskbarState.Position switch
{
TaskbarPosition.Left => FlyoutPlacementMode.Right,
TaskbarPosition.Top => FlyoutPlacementMode.Bottom,
TaskbarPosition.Right => FlyoutPlacementMode.Left,
TaskbarPosition.Bottom => FlyoutPlacementMode.Top,
_ => throw new ArgumentOutOfRangeException(),
};
Activate();
flyoutHost.ShowFlyout(flyoutPlacement);
}
}
protected override void OnContentLoaded()
{
PrepareNotificationIcon();
PrepareTaskbar();
UpdateWindow();
}
protected override void OnDeactivated(EventArgs args)
{
HideFlyout();
}
private void OnFlyoutContentChanged(object sender, EventArgs args)
{
UpdateFlyoutContent();
}
private void OnFlyoutIconSourceChanged(object sender, EventArgs args)
{
UpdateIcons();
}
private void OnFlyoutRequestedThemeChanged(object sender, EventArgs args)
{
UpdateRequestedTheme();
}
private void OnIconInvoked(object sender, NotificationIconInvokedEventArgs args)
{
if (args.MouseButton == MouseButton.Left)
{
ShowFlyout();
}
if (args.MouseButton == MouseButton.Right)
{
ContextMenuRequested?.Invoke(this, EventArgs.Empty);
}
}
private void OnTaskbarChanged(object sender, EventArgs args)
{
UpdateWindow();
}
private void OnThemeChanged(object sender, SystemPersonalisationChangedEventArgs args)
{
UpdateIcons();
}
private void PrepareNotificationIcon()
{
_notificationIconHelper = NotificationIconHelper.Create(this);
_notificationIconHelper.IconInvoked += OnIconInvoked;
_systemPersonalisationHelper = SystemPersonalisationHelper.Create(this);
_systemPersonalisationHelper.ThemeChanged += OnThemeChanged;
UpdateIcons();
}
private void PrepareTaskbar()
{
_taskbarHelper = TaskbarHelper.Create(this);
_taskbarHelper.TaskbarChanged += OnTaskbarChanged;
}
protected override void OnClosed(EventArgs args)
{
_notificationIconHelper.Dispose();
}
private void UpdateFlyoutContent()
{
if (_flyout == null) return;
var content = _flyout.Content;
if (content == null) return;
var flyoutHost = GetHostContent();
if (flyoutHost != null)
{
flyoutHost.Content = content;
}
}
private async void UpdateIcons()
{
if (!IsLoaded) return;
if (_flyout == null) return;
var _defaultIconSource = _flyout.IconSource;
var _lightIconSource = _flyout.LightIconSource;
var shellTrayHandle = WindowHelper.GetHandle(ShellTrayHandleName);
if (shellTrayHandle == null) return;
var dpi = WindowHelper.GetDpi(shellTrayHandle);
var iconSource = _systemPersonalisationHelper.Theme == SystemTheme.Dark ? _defaultIconSource : _lightIconSource;
if (iconSource == null) return;
using var icon = await iconSource.ConvertToIconAsync(dpi);
_notificationIconHelper.SetIcon(icon.Handle);
}
private void UpdateRequestedTheme()
{
if (_flyout == null) return;
var requestedTheme = _flyout.RequestedTheme;
var flyoutHost = GetHostContent();
if (flyoutHost != null)
{
flyoutHost.RequestedTheme = requestedTheme;
}
}
private void UpdateWindow()
{
if (!IsLoaded) return;
var flyoutHost = GetHostContent();
if (flyoutHost == null) return;
var taskbarState = _taskbarHelper.GetCurrentState();
Left = taskbarState.Screen.WorkingArea.Left;
Top = taskbarState.Screen.WorkingArea.Top;
var windowWidth = WindowSize * this.DpiX();
var windowHeight = WindowSize * this.DpiY();
double top, left, height, width;
var taskbarRect = taskbarState.Rect;
switch (taskbarState.Position)
{
case TaskbarPosition.Left:
top = taskbarRect.Bottom - windowHeight;
left = taskbarRect.Right;
height = windowHeight;
width = windowWidth;
break;
case TaskbarPosition.Top:
top = taskbarRect.Bottom;
left = FlowDirection == FlowDirection.RightToLeft ? taskbarRect.Left : taskbarRect.Right - windowWidth;
height = windowHeight;
width = windowWidth;
break;
case TaskbarPosition.Right:
top = taskbarRect.Bottom - windowHeight;
left = taskbarRect.Left - windowWidth;
height = windowHeight;
width = windowWidth;
break;
case TaskbarPosition.Bottom:
top = taskbarRect.Top - windowHeight;
left = FlowDirection == FlowDirection.RightToLeft ? taskbarRect.Left : taskbarRect.Right - windowWidth;
height = windowHeight;
width = windowWidth;
break;
default:
throw new ArgumentOutOfRangeException();
}
this.SetWindowPosition(top, left, height, width);
flyoutHost.SetFlyoutPlacement(taskbarState.Position.ToString());
}
}
}
@@ -1,13 +0,0 @@
using NotificationFlyout.Wpf.UI.Helpers;
using System;
namespace NotificationFlyout.Wpf.UI.Extensions
{
public static class OperatingSystemExtensions
{
public static bool IsGreaterThan(this OperatingSystem operatingSystem, OperatingSystemVersion version)
{
return operatingSystem.Version.Build > (int)version;
}
}
}
@@ -1,200 +0,0 @@
using NotificationFlyout.Wpf.UI.Extensions;
using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Input;
using System.Windows.Interop;
namespace NotificationFlyout.Wpf.UI.Helpers
{
public class NotificationIconHelper : IDisposable
{
private const int CallbackMessage = 0x400;
private const uint IconVersion = 0x4;
private readonly object _lock = new();
private readonly IntPtr _windowHandle;
private bool _isDisposed;
private NotifyIconData _notifyIconData;
private NotificationIconHelper(Window window)
{
_windowHandle = window.GetHandle();
HwndSource source = HwndSource.FromHwnd(_windowHandle);
source.AddHook(new HwndSourceHook(WndProc));
CreateNotificationIcon();
}
~NotificationIconHelper()
{
Dispose(false);
}
public event EventHandler<NotificationIconInvokedEventArgs> IconInvoked;
private enum NotifyIconBalloonType
{
None = 0x00,
Info = 0x01,
Warning = 0x02,
Error = 0x03,
User = 0x04,
NoSound = 0x10,
LargeIcon = 0x20,
RespectQuietTime = 0x80
}
private enum NotifyIconCommand : uint
{
Add = 0x0,
Delete = 0x2,
Modify = 0x1,
SetVersion = 0x4
}
[Flags]
private enum NotifyIconDataMember : uint
{
Message = 0x01,
Icon = 0x02,
Tip = 0x04,
State = 0x08,
Info = 0x10,
Realtime = 0x40,
UseLegacyToolTips = 0x80
}
private enum NotifyIconState : uint
{
Visible = 0x00,
Hidden = 0x01
}
public static NotificationIconHelper Create(Window window)
{
return new NotificationIconHelper(window);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void SetIcon(IntPtr iconHandle)
{
lock (_lock)
{
_notifyIconData.IconHandle = iconHandle;
WriteNotifyIconData(NotifyIconCommand.Modify, NotifyIconDataMember.Icon);
}
}
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr DefWindowProcW(IntPtr handle, uint msg, IntPtr wParam, IntPtr lParam);
[DllImport("shell32.dll", SetLastError = true)]
private static extern int Shell_NotifyIcon(NotifyIconCommand notifyCommand, ref NotifyIconData notifyIconData);
private void CreateNotificationIcon()
{
lock (_lock)
{
_notifyIconData = new NotifyIconData();
_notifyIconData.cbSize = (uint)Marshal.SizeOf(_notifyIconData);
_notifyIconData.WindowHandle = _windowHandle;
_notifyIconData.TaskbarIconId = 0x0;
_notifyIconData.CallbackMessageId = CallbackMessage;
_notifyIconData.VersionOrTimeout = IconVersion;
_notifyIconData.IconHandle = IntPtr.Zero;
_notifyIconData.IconState = NotifyIconState.Hidden;
_notifyIconData.StateMask = NotifyIconState.Hidden;
WriteNotifyIconData(NotifyIconCommand.Add, NotifyIconDataMember.Message | NotifyIconDataMember.Icon | NotifyIconDataMember.Tip);
}
}
private void Dispose(bool disposing)
{
if (_isDisposed || !disposing) return;
lock (_lock)
{
_isDisposed = true;
RemoveNotificationIcon();
}
}
private void InvokeIconInvoked(MouseButton mouseButton)
{
IconInvoked?.Invoke(this, new NotificationIconInvokedEventArgs { MouseButton = mouseButton });
}
private void RemoveNotificationIcon() => WriteNotifyIconData(NotifyIconCommand.Delete, NotifyIconDataMember.Message);
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == CallbackMessage)
{
switch ((uint)lParam)
{
case (uint)WndProcMessages.WM_LBUTTONUP:
InvokeIconInvoked(MouseButton.Left);
break;
case (uint)WndProcMessages.WM_MBUTTONUP:
InvokeIconInvoked(MouseButton.Middle);
break;
case (uint)WndProcMessages.WM_RBUTTONUP:
InvokeIconInvoked(MouseButton.Right);
break;
}
}
return DefWindowProcW(hwnd, (uint)msg, wParam, (lParam));
}
private void WriteNotifyIconData(NotifyIconCommand command, NotifyIconDataMember flags)
{
_notifyIconData.ValidMembers = flags;
lock (_lock)
{
Shell_NotifyIcon(command, ref _notifyIconData);
}
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct NotifyIconData
{
public uint cbSize;
public IntPtr WindowHandle;
public uint TaskbarIconId;
public NotifyIconDataMember ValidMembers;
public uint CallbackMessageId;
public IntPtr IconHandle;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string ToolTipText;
public NotifyIconState IconState;
public NotifyIconState StateMask;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string BalloonText;
public uint VersionOrTimeout;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string BalloonTitle;
public NotifyIconBalloonType BalloonFlags;
public Guid TaskbarIconGuid;
public IntPtr CustomBalloonIconHandle;
}
}
}
@@ -1,10 +0,0 @@
using System;
using System.Windows.Input;
namespace NotificationFlyout.Wpf.UI.Helpers
{
public class NotificationIconInvokedEventArgs : EventArgs
{
public MouseButton MouseButton { get; internal set; }
}
}
@@ -1,118 +0,0 @@
using Microsoft.Windows.Sdk;
using NotificationFlyout.Wpf.UI.Extensions;
using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
namespace NotificationFlyout.Wpf.UI.Helpers
{
public class TaskbarHelper
{
private const string ShellTrayHandleName = "Shell_TrayWnd";
private const int SPI_SETWORKAREA = 0x002F;
private readonly uint WM_TASKBARCREATED = PInvoke.RegisterWindowMessage("TaskbarCreated");
private TaskbarHelper(Window window)
{
var handle = window.GetHandle();
var source = HwndSource.FromHwnd(handle);
source.AddHook(new HwndSourceHook(WndProc));
}
public event EventHandler TaskbarChanged;
private enum AppBarEdge : uint
{
Left = 0,
Top = 1,
Right = 2,
Bottom = 3
}
private enum AppBarMessage : uint
{
New = 0x00000000,
Remove = 0x00000001,
QueryPos = 0x00000002,
SetPos = 0x00000003,
GetState = 0x00000004,
GetTaskbarPos = 0x00000005,
Activate = 0x00000006,
GetAutoHideBar = 0x00000007,
SetAutoHideBar = 0x00000008,
WindowPosChanged = 0x00000009,
SetState = 0x0000000A,
}
public static TaskbarHelper Create(Window window)
{
return new TaskbarHelper(window);
}
public TaskbarState GetCurrentState()
{
var handle = GetSystemTrayHandle();
var state = new TaskbarState
{
Screen = Screen.FromHandle(handle)
};
var appBarData = GetAppBarData(handle);
GetAppBarPosition(ref appBarData);
state.Rect = appBarData.rect.ToRect();
state.Position = (TaskbarPosition)appBarData.uEdge;
return state;
}
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr DefWindowProcW(IntPtr handle, uint msg, IntPtr wParam, IntPtr lParam);
private static IntPtr GetSystemTrayHandle()
{
return WindowHelper.GetHandle(ShellTrayHandleName);
}
[DllImport("shell32.dll", SetLastError = true)]
private static extern IntPtr SHAppBarMessage(AppBarMessage dwMessage, ref AppBarData pData);
private AppBarData GetAppBarData(IntPtr handle)
{
return new AppBarData
{
cbSize = (uint)Marshal.SizeOf(typeof(AppBarData)),
hWnd = handle
};
}
private void GetAppBarPosition(ref AppBarData appBarData)
{
SHAppBarMessage(AppBarMessage.GetTaskbarPos, ref appBarData);
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_TASKBARCREATED || msg == (int)WndProcMessages.WM_SETTINGCHANGE && (int)wParam == SPI_SETWORKAREA)
{
TaskbarChanged?.Invoke(this, EventArgs.Empty);
}
return DefWindowProcW(hwnd, (uint)msg, wParam, (lParam));
}
[StructLayout(LayoutKind.Sequential)]
private struct AppBarData
{
public uint cbSize;
public IntPtr hWnd;
public uint uCallbackMessage;
public AppBarEdge uEdge;
public RECT rect;
public int lParam;
}
}
}
@@ -1,11 +0,0 @@
namespace NotificationFlyout.Wpf.UI
{
public enum TaskbarPosition
{
Left = 0,
Top = 1,
Right = 2,
Bottom = 3
}
}
@@ -1,11 +0,0 @@
using System.Windows;
namespace NotificationFlyout.Wpf.UI
{
public struct TaskbarState
{
public TaskbarPosition Position;
public Rect Rect;
public Screen Screen;
}
}
@@ -1,18 +0,0 @@
using System;
using Microsoft.Windows.Sdk;
namespace NotificationFlyout.Wpf.UI.Helpers
{
public class WindowHelper
{
public static IntPtr GetHandle(string windowName)
{
return PInvoke.FindWindow(windowName, null);
}
public static uint GetDpi(IntPtr handle)
{
return PInvoke.GetDpiForWindow((HWND)handle);
}
}
}
@@ -1,3 +0,0 @@
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("NotificationFlyout.Wpf.UI.Controls")]
-120
View File
@@ -1,120 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30914.41
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyout.Wpf.UI.Controls", "NotificationFlyout.Wpf.UI.Controls\NotificationFlyout.Wpf.UI.Controls.csproj", "{0A782234-DC9F-4C4A-8820-FC640B03D233}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyout.Uwp.UI.Controls", "NotificationFlyout.Uwp.UI.Controls\NotificationFlyout.Uwp.UI.Controls.csproj", "{9987B132-E42C-401A-9AD5-E62529FACA40}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyout.Wpf.UI", "NotificationFlyout.Wpf.UI\NotificationFlyout.Wpf.UI.csproj", "{29430194-7EDE-4C33-AF59-CE121F48F66E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B7EEAC24-4F8A-4C73-90B3-DAC77D44CCF2}"
ProjectSection(SolutionItems) = preProject
global.json = global.json
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyout.Uwp.UI", "NotificationFlyout.Uwp.UI\NotificationFlyout.Uwp.UI.csproj", "{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|ARM = Debug|ARM
Debug|ARM64 = Debug|ARM64
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|ARM = Release|ARM
Release|ARM64 = Release|ARM64
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Debug|Any CPU.ActiveCfg = Debug|x64
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Debug|Any CPU.Build.0 = Debug|x64
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Debug|ARM.ActiveCfg = Debug|Any CPU
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Debug|ARM.Build.0 = Debug|Any CPU
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Debug|ARM64.Build.0 = Debug|Any CPU
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Debug|x64.ActiveCfg = Debug|x64
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Debug|x64.Build.0 = Debug|x64
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Debug|x86.ActiveCfg = Debug|Any CPU
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Debug|x86.Build.0 = Debug|Any CPU
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Release|Any CPU.Build.0 = Release|Any CPU
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Release|ARM.ActiveCfg = Release|Any CPU
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Release|ARM.Build.0 = Release|Any CPU
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Release|ARM64.ActiveCfg = Release|Any CPU
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Release|ARM64.Build.0 = Release|Any CPU
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Release|x64.ActiveCfg = Release|x64
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Release|x64.Build.0 = Release|x64
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Release|x86.ActiveCfg = Release|Any CPU
{0A782234-DC9F-4C4A-8820-FC640B03D233}.Release|x86.Build.0 = Release|Any CPU
{9987B132-E42C-401A-9AD5-E62529FACA40}.Debug|Any CPU.ActiveCfg = Debug|x64
{9987B132-E42C-401A-9AD5-E62529FACA40}.Debug|Any CPU.Build.0 = Debug|x64
{9987B132-E42C-401A-9AD5-E62529FACA40}.Debug|ARM.ActiveCfg = Debug|ARM
{9987B132-E42C-401A-9AD5-E62529FACA40}.Debug|ARM.Build.0 = Debug|ARM
{9987B132-E42C-401A-9AD5-E62529FACA40}.Debug|ARM64.ActiveCfg = Debug|ARM64
{9987B132-E42C-401A-9AD5-E62529FACA40}.Debug|ARM64.Build.0 = Debug|ARM64
{9987B132-E42C-401A-9AD5-E62529FACA40}.Debug|x64.ActiveCfg = Debug|x64
{9987B132-E42C-401A-9AD5-E62529FACA40}.Debug|x64.Build.0 = Debug|x64
{9987B132-E42C-401A-9AD5-E62529FACA40}.Debug|x86.ActiveCfg = Debug|x86
{9987B132-E42C-401A-9AD5-E62529FACA40}.Debug|x86.Build.0 = Debug|x86
{9987B132-E42C-401A-9AD5-E62529FACA40}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9987B132-E42C-401A-9AD5-E62529FACA40}.Release|Any CPU.Build.0 = Release|Any CPU
{9987B132-E42C-401A-9AD5-E62529FACA40}.Release|ARM.ActiveCfg = Release|ARM
{9987B132-E42C-401A-9AD5-E62529FACA40}.Release|ARM.Build.0 = Release|ARM
{9987B132-E42C-401A-9AD5-E62529FACA40}.Release|ARM64.ActiveCfg = Release|ARM64
{9987B132-E42C-401A-9AD5-E62529FACA40}.Release|ARM64.Build.0 = Release|ARM64
{9987B132-E42C-401A-9AD5-E62529FACA40}.Release|x64.ActiveCfg = Release|x64
{9987B132-E42C-401A-9AD5-E62529FACA40}.Release|x64.Build.0 = Release|x64
{9987B132-E42C-401A-9AD5-E62529FACA40}.Release|x86.ActiveCfg = Release|x86
{9987B132-E42C-401A-9AD5-E62529FACA40}.Release|x86.Build.0 = Release|x86
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Debug|Any CPU.ActiveCfg = Debug|x64
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Debug|Any CPU.Build.0 = Debug|x64
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Debug|ARM.ActiveCfg = Debug|Any CPU
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Debug|ARM.Build.0 = Debug|Any CPU
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Debug|ARM64.Build.0 = Debug|Any CPU
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Debug|x64.ActiveCfg = Debug|x64
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Debug|x64.Build.0 = Debug|x64
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Debug|x86.ActiveCfg = Debug|Any CPU
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Debug|x86.Build.0 = Debug|Any CPU
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Release|Any CPU.Build.0 = Release|Any CPU
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Release|ARM.ActiveCfg = Release|Any CPU
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Release|ARM.Build.0 = Release|Any CPU
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Release|ARM64.ActiveCfg = Release|Any CPU
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Release|ARM64.Build.0 = Release|Any CPU
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Release|x64.ActiveCfg = Release|x64
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Release|x64.Build.0 = Release|x64
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Release|x86.ActiveCfg = Release|Any CPU
{29430194-7EDE-4C33-AF59-CE121F48F66E}.Release|x86.Build.0 = Release|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Debug|Any CPU.ActiveCfg = Debug|x64
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Debug|Any CPU.Build.0 = Debug|x64
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Debug|ARM.ActiveCfg = Debug|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Debug|ARM.Build.0 = Debug|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Debug|ARM64.Build.0 = Debug|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Debug|x64.ActiveCfg = Debug|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Debug|x64.Build.0 = Debug|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Debug|x86.ActiveCfg = Debug|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Debug|x86.Build.0 = Debug|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Release|Any CPU.Build.0 = Release|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Release|ARM.ActiveCfg = Release|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Release|ARM.Build.0 = Release|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Release|ARM64.ActiveCfg = Release|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Release|ARM64.Build.0 = Release|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Release|x64.ActiveCfg = Release|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Release|x64.Build.0 = Release|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Release|x86.ActiveCfg = Release|Any CPU
{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {EDFFB261-AD00-4C68-BF55-D5CED5BE0039}
EndGlobalSection
EndGlobal
@@ -1,6 +1,6 @@
using Microsoft.Windows.Sdk;
namespace NotificationFlyout.Uwp.UI.Extensions
namespace TheXamlGuy.NotificationFlyout.Common.Extensions
{
internal class ExecutionMode
{
@@ -2,13 +2,11 @@
using System;
using System.Drawing;
using System.IO;
using System.Threading.Tasks;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Text;
namespace NotificationFlyout.Uwp.UI.Extensions
namespace TheXamlGuy.NotificationFlyout.Common.Extensions
{
public static class ImageSourceExtensions
{
@@ -20,17 +18,25 @@ namespace NotificationFlyout.Uwp.UI.Extensions
var uri = $"{AppDomain.CurrentDomain.BaseDirectory}{bitmapImage.UriSource}".Replace("ms-appx:///", "").Replace("/", "\\");
using var stream = File.OpenRead(uri);
return new Icon(stream, new Size(PInvoke.GetSystemMetricsForDpi((int)SystemMetricFlag.SM_CXICON, dpi), PInvoke.GetSystemMetricsForDpi((int)SystemMetricFlag.SM_CYICON, dpi)));
return ExtractIcon(dpi, stream);
}
else
{
var storageFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(bitmapImage.UriSource);
using var stream = await storageFile.OpenStreamForReadAsync();
return new Icon(stream, new Size(PInvoke.GetSystemMetricsForDpi((int)SystemMetricFlag.SM_CXICON, dpi), PInvoke.GetSystemMetricsForDpi((int)SystemMetricFlag.SM_CYICON, dpi)));
using var stream = await storageFile.OpenStreamForReadAsync();
return ExtractIcon(dpi, stream);
}
}
private static Icon ExtractIcon(uint dpi, Stream stream)
{
var bitmap = (Bitmap)Image.FromStream(stream);
var icon = Icon.FromHandle(bitmap.GetHicon());
return new Icon(icon, new Size(PInvoke.GetSystemMetricsForDpi((int)SystemMetricFlag.SM_CXICON, dpi), PInvoke.GetSystemMetricsForDpi((int)SystemMetricFlag.SM_CYICON, dpi)));
}
private enum SystemMetricFlag : int
{
SM_CXICON = 11,
@@ -0,0 +1,9 @@
using System;
namespace TheXamlGuy.NotificationFlyout.Common.Extensions
{
public static class OperatingSystemExtensions
{
public static bool IsGreaterThan(this OperatingSystem operatingSystem, OperatingSystemVersion version) => operatingSystem.Version.Build > (int)version;
}
}
@@ -1,4 +1,5 @@
namespace NotificationFlyout.Wpf.UI.Helpers

namespace TheXamlGuy.NotificationFlyout.Common.Extensions
{
public enum OperatingSystemVersion : int
{
@@ -1,14 +1,13 @@
using Microsoft.Windows.Sdk;
using System.Windows;
using Windows.Foundation;
namespace NotificationFlyout.Wpf.UI.Extensions
namespace TheXamlGuy.NotificationFlyout.Common.Extensions
{
internal static class RECTExtensions
{
internal static Rect ToRect(this RECT rect)
{
if (rect.right - rect.left < 0 || rect.bottom - rect.top < 0) return new Rect(rect.left, rect.top, 0, 0);
return new Rect(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
}
}
@@ -1,6 +1,6 @@
using Microsoft.Win32;
namespace NotificationFlyout.Wpf.UI.Extensions
namespace TheXamlGuy.NotificationFlyout.Common.Extensions
{
public static class RegistryKeyExtensions
{
@@ -1,12 +1,12 @@
using Microsoft.Windows.Sdk;
namespace NotificationFlyout.Wpf.UI.Helpers
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
internal class CursorHelper
{
public static POINT GetPhysicalCursorPos()
{
PInvoke.GetPhysicalCursorPos(out POINT point);
PInvoke.GetPhysicalCursorPos(out var point);
return point;
}
}
@@ -0,0 +1,81 @@
using System;
using System.Runtime.InteropServices;
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public partial class NotificationIconHelper
{
private enum NotifyIconBalloonType
{
None = 0x00,
Info = 0x01,
Warning = 0x02,
Error = 0x03,
User = 0x04,
NoSound = 0x10,
LargeIcon = 0x20,
RespectQuietTime = 0x80
}
private enum NotifyIconCommand : uint
{
Add = 0x0,
Delete = 0x2,
Modify = 0x1,
SetVersion = 0x4
}
[Flags]
private enum NotifyIconDataMember : uint
{
Message = 0x01,
Icon = 0x02,
Tip = 0x04,
State = 0x08,
Info = 0x10,
Realtime = 0x40,
UseLegacyToolTips = 0x80
}
private enum NotifyIconState : uint
{
Visible = 0x00,
Hidden = 0x01
}
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr DefWindowProcW(IntPtr handle, uint msg, IntPtr wParam, IntPtr lParam);
[DllImport("shell32.dll", SetLastError = true)]
private static extern int Shell_NotifyIcon(NotifyIconCommand notifyCommand, ref NotifyIconData notifyIconData);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct NotifyIconData
{
public uint cbSize;
public IntPtr WindowHandle;
public uint TaskbarIconId;
public NotifyIconDataMember ValidMembers;
public uint CallbackMessageId;
public IntPtr IconHandle;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string ToolTipText;
public NotifyIconState IconState;
public NotifyIconState StateMask;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string BalloonText;
public uint VersionOrTimeout;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string BalloonTitle;
public NotifyIconBalloonType BalloonFlags;
public Guid TaskbarIconGuid;
public IntPtr CustomBalloonIconHandle;
}
}
}
@@ -0,0 +1,110 @@
using System;
using System.Runtime.InteropServices;
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public partial class NotificationIconHelper : IDisposable, IWndProcHandler
{
private const int CallbackMessage = 0x400;
private const uint IconVersion = 0x4;
private readonly object _lock = new();
private bool _isDisposed;
private NotifyIconData _notifyIconData;
private NotificationIconHelper()
{
WndProcHandlerSubscriber.Current.Subscribe(this);
CreateNotificationIcon();
}
~NotificationIconHelper()
{
Dispose(false);
}
public event EventHandler<NotificationIconInvokedEventArgs> IconInvoked;
public static NotificationIconHelper Create() => new();
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Handle(uint message, IntPtr wParam, IntPtr lParam)
{
if (message == CallbackMessage)
{
switch ((uint)lParam)
{
case (uint)WndProcMessages.WM_LBUTTONUP:
InvokeIconInvoked(PointerButton.Left);
break;
case (uint)WndProcMessages.WM_MBUTTONUP:
InvokeIconInvoked(PointerButton.Middle);
break;
case (uint)WndProcMessages.WM_RBUTTONUP:
InvokeIconInvoked(PointerButton.Right);
break;
}
}
}
public void SetIcon(IntPtr iconHandle)
{
lock (_lock)
{
_notifyIconData.IconHandle = iconHandle;
WriteNotifyIconData(NotifyIconCommand.Modify, NotifyIconDataMember.Icon);
}
}
private void CreateNotificationIcon()
{
lock (_lock)
{
_notifyIconData = new NotifyIconData();
_notifyIconData.cbSize = (uint)Marshal.SizeOf(_notifyIconData);
_notifyIconData.WindowHandle = WndProcListener.Current.Handle;
_notifyIconData.TaskbarIconId = 0x0;
_notifyIconData.CallbackMessageId = CallbackMessage;
_notifyIconData.VersionOrTimeout = IconVersion;
_notifyIconData.IconHandle = IntPtr.Zero;
_notifyIconData.IconState = NotifyIconState.Hidden;
_notifyIconData.StateMask = NotifyIconState.Hidden;
WriteNotifyIconData(NotifyIconCommand.Add, NotifyIconDataMember.Message | NotifyIconDataMember.Icon | NotifyIconDataMember.Tip);
}
}
private void Dispose(bool disposing)
{
if (_isDisposed || !disposing) return;
lock (_lock)
{
_isDisposed = true;
RemoveNotificationIcon();
}
}
private void InvokeIconInvoked(PointerButton pointerButton) => IconInvoked?.Invoke(this, new NotificationIconInvokedEventArgs(pointerButton));
private void RemoveNotificationIcon() => WriteNotifyIconData(NotifyIconCommand.Delete, NotifyIconDataMember.Message);
private void WriteNotifyIconData(NotifyIconCommand command, NotifyIconDataMember flags)
{
_notifyIconData.ValidMembers = flags;
lock (_lock)
{
Shell_NotifyIcon(command, ref _notifyIconData);
}
}
}
}
@@ -0,0 +1,11 @@
using System;
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public class NotificationIconInvokedEventArgs : EventArgs
{
internal NotificationIconInvokedEventArgs(PointerButton pointerButton) => PointerButton = pointerButton;
public PointerButton PointerButton { get; private set; }
}
}
@@ -0,0 +1,12 @@
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public enum PointerButton
{
Left = 0,
Middle = 1,
Right = 2,
XButton1 = 3,
XButton2 = 4
}
}
@@ -1,10 +1,9 @@
using Microsoft.Windows.Sdk;
using NotificationFlyout.Wpf.UI.Helpers;
using System;
using System.Runtime.InteropServices;
using System.Windows;
using Windows.Foundation;
namespace NotificationFlyout.Wpf.UI
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public class Screen
{
@@ -62,14 +61,8 @@ namespace NotificationFlyout.Wpf.UI
public override bool Equals(object obj)
{
if (obj is Screen monitor)
{
if (_monitorHandle == monitor._monitorHandle)
{
return true;
}
}
return false;
if (obj is not Screen monitor) return false;
return _monitorHandle == monitor._monitorHandle;
}
public override int GetHashCode()
@@ -1,9 +1,8 @@
using Microsoft.Windows.Sdk;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows;
using Windows.Foundation;
namespace NotificationFlyout.Wpf.UI.Helpers
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public static class SystemInformationHelper
{
@@ -14,16 +13,6 @@ namespace NotificationFlyout.Wpf.UI.Helpers
public static Rect VirtualScreen => GetVirtualScreen();
public static Rect WorkingArea => GetWorkingArea();
public static int GetCurrentDpi()
{
return (int)typeof(SystemParameters).GetProperty("Dpi", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, null);
}
public static double GetCurrentDpiScaleFactor()
{
return (double)GetCurrentDpi() / 96;
}
private static Rect GetVirtualScreen()
{
var size = new Size(PInvoke.GetSystemMetrics(SM_CXSCREEN), PInvoke.GetSystemMetrics(SM_CYSCREEN));
@@ -1,6 +1,6 @@
using System;
namespace NotificationFlyout.Wpf.UI.Helpers
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public class SystemPersonalisationChangedEventArgs : EventArgs
{
@@ -13,6 +13,5 @@ namespace NotificationFlyout.Wpf.UI.Helpers
public SystemTheme Theme { get; private set; }
public bool IsColorPrevalence { get; private set; }
}
}
@@ -1,24 +1,22 @@
using Microsoft.Win32;
using NotificationFlyout.Wpf.UI.Extensions;
using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
using TheXamlGuy.NotificationFlyout.Common.Extensions;
using Windows.UI.ViewManagement;
namespace NotificationFlyout.Wpf.UI.Helpers
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public class SystemPersonalisationHelper
public class SystemPersonalisationHelper : IWndProcHandler
{
private static readonly Lazy<SystemPersonalisationHelper> _current = new(() => new SystemPersonalisationHelper());
private readonly UISettings _settings = new();
private readonly string PersonalizeKey = @"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize";
private SystemTheme _currentTheme;
private bool _isColorPrevalence;
private SystemPersonalisationHelper(Window window)
private SystemPersonalisationHelper()
{
var source = HwndSource.FromHwnd(window.GetHandle());
source.AddHook(new HwndSourceHook(WndProc));
WndProcHandlerSubscriber.Current.Subscribe(this);
_currentTheme = GetTheme();
_isColorPrevalence = GetIsColorPrevalence();
@@ -26,16 +24,17 @@ namespace NotificationFlyout.Wpf.UI.Helpers
public event EventHandler<SystemPersonalisationChangedEventArgs> ThemeChanged;
public static SystemPersonalisationHelper Current => _current.Value;
public bool IsColorPrevalence => GetIsColorPrevalence();
public SystemTheme Theme => GetTheme();
public static SystemPersonalisationHelper Create(Window window)
public void Handle(uint message, IntPtr wParam, IntPtr lParam)
{
return new SystemPersonalisationHelper(window);
if (message == (int)WndProcMessages.WM_SETTINGCHANGE)
{
RaiseThemeChangedEvent();
}
}
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr DefWindowProcW(IntPtr handle, uint msg, IntPtr wParam, IntPtr lParam);
private bool GetIsColorPrevalence()
{
@@ -63,15 +62,5 @@ namespace NotificationFlyout.Wpf.UI.Helpers
ThemeChanged?.Invoke(this, new SystemPersonalisationChangedEventArgs(theme, isColorPrevalence));
}
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == (int)WndProcMessages.WM_SETTINGCHANGE)
{
RaiseThemeChangedEvent();
}
return DefWindowProcW(hwnd, (uint)msg, wParam, (lParam));
}
}
}
@@ -1,4 +1,5 @@
namespace NotificationFlyout.Wpf.UI.Helpers

namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public enum SystemTheme
{
@@ -0,0 +1,55 @@
using Microsoft.Windows.Sdk;
using System;
using System.Runtime.InteropServices;
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public partial class TaskbarHelper
{
private const string ShellTrayHandleName = "Shell_TrayWnd";
private const int SPI_SETWORKAREA = 0x002F;
private readonly uint WM_TASKBARCREATED = PInvoke.RegisterWindowMessage("TaskbarCreated");
private enum AppBarEdge : uint
{
Left = 0,
Top = 1,
Right = 2,
Bottom = 3
}
private enum AppBarMessage : uint
{
New = 0x00000000,
Remove = 0x00000001,
QueryPos = 0x00000002,
SetPos = 0x00000003,
GetState = 0x00000004,
GetTaskbarPos = 0x00000005,
Activate = 0x00000006,
GetAutoHideBar = 0x00000007,
SetAutoHideBar = 0x00000008,
WindowPosChanged = 0x00000009,
SetState = 0x0000000A,
}
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr DefWindowProcW(IntPtr handle, uint msg, IntPtr wParam, IntPtr lParam);
private static IntPtr GetSystemTrayHandle() => WindowHelper.GetHandle(ShellTrayHandleName);
[DllImport("shell32.dll", SetLastError = true)]
private static extern IntPtr SHAppBarMessage(AppBarMessage dwMessage, ref AppBarData pData);
[StructLayout(LayoutKind.Sequential)]
private struct AppBarData
{
public uint cbSize;
public IntPtr hWnd;
public uint uCallbackMessage;
public AppBarEdge uEdge;
public RECT rect;
public int lParam;
}
}
}
@@ -0,0 +1,51 @@
using System;
using System.Runtime.InteropServices;
using TheXamlGuy.NotificationFlyout.Common.Extensions;
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public partial class TaskbarHelper : IWndProcHandler
{
private TaskbarHelper() => WndProcHandlerSubscriber.Current.Subscribe(this);
public event EventHandler TaskbarChanged;
public static TaskbarHelper Create() => new();
public TaskbarState GetCurrentState()
{
var handle = GetSystemTrayHandle();
var state = new TaskbarState
{
Screen = Screen.FromHandle(handle)
};
var appBarData = GetAppBarData(handle);
GetAppBarPosition(ref appBarData);
state.Rect = appBarData.rect.ToRect();
state.Placement = (TaskbarPlacement)appBarData.uEdge;
return state;
}
public void Handle(uint message, IntPtr wParam, IntPtr lParam)
{
if (message == WM_TASKBARCREATED || message == (int)WndProcMessages.WM_SETTINGCHANGE && (int)wParam == SPI_SETWORKAREA)
{
TaskbarChanged?.Invoke(this, EventArgs.Empty);
}
}
private AppBarData GetAppBarData(IntPtr handle)
{
return new AppBarData
{
cbSize = (uint)Marshal.SizeOf(typeof(AppBarData)),
hWnd = handle
};
}
private void GetAppBarPosition(ref AppBarData appBarData) => SHAppBarMessage(AppBarMessage.GetTaskbarPos, ref appBarData);
}
}
@@ -0,0 +1,11 @@
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public enum TaskbarPlacement
{
Left = 0,
Top = 1,
Right = 2,
Bottom = 3
}
}
@@ -0,0 +1,11 @@
using Windows.Foundation;
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public struct TaskbarState
{
public TaskbarPlacement Placement;
public Rect Rect;
public Screen Screen;
}
}
@@ -0,0 +1,12 @@
using Microsoft.Windows.Sdk;
using System;
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public class WindowHelper
{
public static IntPtr GetHandle(string windowName) => PInvoke.FindWindow(windowName, null);
public static uint GetDpi(IntPtr handle) => PInvoke.GetDpiForWindow((HWND)handle);
}
}
@@ -0,0 +1,35 @@
using System;
using System.Runtime.InteropServices;
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
internal partial class WndProcHelper
{
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr CreateWindowExW(uint dwExStyle, [MarshalAs(UnmanagedType.LPWStr)] string lpClassName, [MarshalAs(UnmanagedType.LPWStr)] string lpWindowName, uint dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, IntPtr hMenu, IntPtr hInstance, IntPtr lpParam);
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr DefWindowProcW(IntPtr handle, uint msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
private static extern bool DestroyWindow(IntPtr handle);
[DllImport("user32.dll", SetLastError = true)]
private static extern ushort RegisterClassW([In] ref WNDCLASSW lpWndClass);
[StructLayout(LayoutKind.Sequential)]
private struct WNDCLASSW
{
public uint style;
public WndProcHandler 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;
}
}
}
@@ -0,0 +1,50 @@
using System;
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
internal partial class WndProcHelper : IDisposable
{
private WndProcHandler _handler;
private WndProcHelper() => CreateWndProcWindow();
private delegate IntPtr WndProcHandler(IntPtr hwnd, uint uMsg, IntPtr wparam, IntPtr lparam);
public event EventHandler<WndProcHelperMessageEventArgs> WndProcMessage;
public IntPtr Handle { get; private set; }
public static WndProcHelper Create() => new();
public void Dispose() => DestroyWindow(Handle);
private void CreateWndProcWindow()
{
var windowName = Guid.NewGuid().ToString();
_handler = WndProc;
WNDCLASSW wndProcWindow;
wndProcWindow.style = 0;
wndProcWindow.lpfnWndProc = _handler;
wndProcWindow.cbClsExtra = 0;
wndProcWindow.cbWndExtra = 0;
wndProcWindow.hInstance = IntPtr.Zero;
wndProcWindow.hIcon = IntPtr.Zero;
wndProcWindow.hCursor = IntPtr.Zero;
wndProcWindow.hbrBackground = IntPtr.Zero;
wndProcWindow.lpszMenuName = "";
wndProcWindow.lpszClassName = windowName;
RegisterClassW(ref wndProcWindow);
Handle = CreateWindowExW(0, windowName, "", 0, 0, 0, 1, 1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
}
private IntPtr WndProc(IntPtr handle, uint message, IntPtr wParam, IntPtr lParam)
{
WndProcMessage?.Invoke(this, new WndProcHelperMessageEventArgs(message, wParam, lParam));
return DefWindowProcW(handle, message, wParam, lParam);
}
}
}
@@ -0,0 +1,18 @@
using System;
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
internal class WndProcHelperMessageEventArgs : EventArgs
{
public WndProcHelperMessageEventArgs(uint message, IntPtr wParam, IntPtr lParam)
{
Message = message;
WParam = wParam;
LParam = lParam;
}
public IntPtr LParam { get; private set; }
public uint Message { get; private set; }
public IntPtr WParam { get; private set; }
}
}
@@ -1,4 +1,5 @@
namespace NotificationFlyout.Wpf.UI.Helpers

namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
internal enum WndProcMessages
{
@@ -1,13 +1,14 @@
Shell_NotifyIcon
GetSystemMetricsForDpi
DefWindowProcW
GetSystemMetrics
MonitorFromWindow
RegisterWindowMessage
SHAppBarMessage
SetWindowPos
GetWindowLong
SetWindowLong
GetDpiForWindow
FindWindow
GetPhysicalCursorPos
GetSystemMetricsForDpi
GetCurrentPackageFullName
GetSystemMetrics
SetWindowLong
SetWindowPos
@@ -0,0 +1,5 @@
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("TheXamlGuy.NotificationFlyout.Wpf.UI")]
[assembly: InternalsVisibleTo("TheXamlGuy.NotificationFlyout.Wpf.UI.Extensions")]
[assembly: InternalsVisibleTo("TheXamlGuy.NotificationFlyout.Wpf.UI.Controls")]
@@ -0,0 +1,26 @@
<Project Sdk="MSBuild.Sdk.Extras">
<PropertyGroup>
<TargetFrameworks>netcoreapp3.1</TargetFrameworks>
<LangVersion>9.0</LangVersion>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<Company>TheXamlGuy</Company>
<Company>TheXamlGuy</Company>
<Authors>Daniel Clark</Authors>
<Product>TheXamlGuy.NotificationFlyout</Product>
<Version>1.1.0</Version>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Windows.SDK.Contracts" Version="10.0.19041.1" Condition="'$(TargetFramework)' == 'netcoreapp3.1'" />
<PackageReference Include="Microsoft.Win32.Registry" Version="6.0.0-preview.1.21102.12" />
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.1.319-beta">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="System.Drawing.Common" Version="6.0.0-preview.1.21102.12" />
<PackageReference Include="System.Memory" Version="4.5.4" />
</ItemGroup>
</Project>
@@ -0,0 +1,9 @@
using System;
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
public interface IWndProcHandler
{
void Handle(uint message, IntPtr wParam, IntPtr lParam);
}
}
@@ -0,0 +1,8 @@
using System.Collections.Generic;
namespace TheXamlGuy.NotificationFlyout.Common.Helpers
{
internal interface IWndProcHandlerCollection : IList<WndProcHandlerReference>
{
}
}

Some files were not shown because too many files have changed in this diff Show More