diff --git a/samples/NotificationFlyoutSample.Host/NotificationFlyoutSample.Host.csproj b/samples/NotificationFlyoutSample.Host/NotificationFlyoutSample.Host.csproj
index ce80946..aeab0b6 100644
--- a/samples/NotificationFlyoutSample.Host/NotificationFlyoutSample.Host.csproj
+++ b/samples/NotificationFlyoutSample.Host/NotificationFlyoutSample.Host.csproj
@@ -20,6 +20,7 @@
+
diff --git a/samples/NotificationFlyoutSample.sln b/samples/NotificationFlyoutSample.sln
index 9079ea8..901c113 100644
--- a/samples/NotificationFlyoutSample.sln
+++ b/samples/NotificationFlyoutSample.sln
@@ -22,6 +22,8 @@ Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "NotificationFlyoutSample.Pa
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationFlyout.Uwp.UI", "..\src\NotificationFlyout.Uwp.UI\NotificationFlyout.Uwp.UI.csproj", "{AFCE4980-A641-4BBB-A745-F0D4E54A0D86}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotificationFlyout.Shared.UI", "NotificationFlyout.Shared.UI\NotificationFlyout.Shared.UI.csproj", "{6D11191A-6A61-4A93-BEBB-EC34FE9FA403}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -193,6 +195,26 @@ Global
{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
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Debug|ARM.Build.0 = Debug|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Debug|x64.Build.0 = Debug|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Debug|x86.Build.0 = Debug|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Release|ARM.ActiveCfg = Release|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Release|ARM.Build.0 = Release|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Release|ARM64.Build.0 = Release|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Release|x64.ActiveCfg = Release|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Release|x64.Build.0 = Release|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Release|x86.ActiveCfg = Release|Any CPU
+ {6D11191A-6A61-4A93-BEBB-EC34FE9FA403}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/samples/NotificationFlyoutSample/NotificationFlyoutSample.Host/Program.cs b/samples/NotificationFlyoutSample/NotificationFlyoutSample.Host/Program.cs
index 2e523ad..34671c4 100644
--- a/samples/NotificationFlyoutSample/NotificationFlyoutSample.Host/Program.cs
+++ b/samples/NotificationFlyoutSample/NotificationFlyoutSample.Host/Program.cs
@@ -1,4 +1,5 @@
-using System;
+using NotificationFlyout.Wpf.UI.Controls;
+using System;
namespace NotificationFlyoutSample.Host
{
@@ -10,7 +11,10 @@ namespace NotificationFlyoutSample.Host
using (new NotificationFlyoutSample.App())
{
var app = new App();
- new SampleNotificationFlyout();
+ new NotificationFlyoutApplication
+ {
+ Flyout = new Shell()
+ };
app.Run();
}
}
diff --git a/samples/NotificationFlyoutSample/NotificationFlyoutSample.Host/SampleNotificationFlyout.xaml b/samples/NotificationFlyoutSample/NotificationFlyoutSample.Host/SampleNotificationFlyout.xaml
deleted file mode 100644
index 6d456f7..0000000
--- a/samples/NotificationFlyoutSample/NotificationFlyoutSample.Host/SampleNotificationFlyout.xaml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/samples/NotificationFlyoutSample/NotificationFlyoutSample.Host/SampleNotificationFlyout.xaml.cs b/samples/NotificationFlyoutSample/NotificationFlyoutSample.Host/SampleNotificationFlyout.xaml.cs
deleted file mode 100644
index d2795ec..0000000
--- a/samples/NotificationFlyoutSample/NotificationFlyoutSample.Host/SampleNotificationFlyout.xaml.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace NotificationFlyoutSample.Host
-{
- public partial class SampleNotificationFlyout
- {
- public SampleNotificationFlyout()
- {
- InitializeComponent();
- }
- }
-}
diff --git a/samples/NotificationFlyoutSample/NotificationFlyoutSample.sln b/samples/NotificationFlyoutSample/NotificationFlyoutSample.sln
index 5940889..cf09d7a 100644
--- a/samples/NotificationFlyoutSample/NotificationFlyoutSample.sln
+++ b/samples/NotificationFlyoutSample/NotificationFlyoutSample.sln
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30914.41
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotificationFlyoutSample.Host", "NotificationFlyoutSample.Host\NotificationFlyoutSample.Host.csproj", "{D13742AD-DB71-4269-B3AF-7CA8C4E51A19}"
+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
diff --git a/samples/NotificationFlyoutSample/NotificationFlyoutSample/Assets/Icon-Light.ico b/samples/NotificationFlyoutSample/NotificationFlyoutSample/Assets/Icon-Light.ico
new file mode 100644
index 0000000..5c7e7a8
Binary files /dev/null and b/samples/NotificationFlyoutSample/NotificationFlyoutSample/Assets/Icon-Light.ico differ
diff --git a/samples/NotificationFlyoutSample/NotificationFlyoutSample/Assets/Icon.ico b/samples/NotificationFlyoutSample/NotificationFlyoutSample/Assets/Icon.ico
new file mode 100644
index 0000000..6375e26
Binary files /dev/null and b/samples/NotificationFlyoutSample/NotificationFlyoutSample/Assets/Icon.ico differ
diff --git a/samples/NotificationFlyoutSample/NotificationFlyoutSample/NotificationFlyoutSample.csproj b/samples/NotificationFlyoutSample/NotificationFlyoutSample/NotificationFlyoutSample.csproj
index ba35c2f..8d12e4a 100644
--- a/samples/NotificationFlyoutSample/NotificationFlyoutSample/NotificationFlyoutSample.csproj
+++ b/samples/NotificationFlyoutSample/NotificationFlyoutSample/NotificationFlyoutSample.csproj
@@ -130,6 +130,8 @@
+
+
diff --git a/samples/NotificationFlyoutSample/NotificationFlyoutSample/Shell.xaml b/samples/NotificationFlyoutSample/NotificationFlyoutSample/Shell.xaml
index 4168d62..a6e1b16 100644
--- a/samples/NotificationFlyoutSample/NotificationFlyoutSample/Shell.xaml
+++ b/samples/NotificationFlyoutSample/NotificationFlyoutSample/Shell.xaml
@@ -1,16 +1,83 @@
-
-
+ xmlns:controls="using:NotificationFlyout.Uwp.UI.Controls"
+ xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
+ IconSource="/Assets/Icon.ico"
+ LightIconSource="/Assets/Icon-Light.ico">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/samples/NotificationFlyoutSample/NotificationFlyoutSample/Shell.xaml.cs b/samples/NotificationFlyoutSample/NotificationFlyoutSample/Shell.xaml.cs
index e9182a1..127099a 100644
--- a/samples/NotificationFlyoutSample/NotificationFlyoutSample/Shell.xaml.cs
+++ b/samples/NotificationFlyoutSample/NotificationFlyoutSample/Shell.xaml.cs
@@ -1,27 +1,26 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Runtime.InteropServices.WindowsRuntime;
-using Windows.Foundation;
-using Windows.Foundation.Collections;
-using Windows.UI.Xaml;
-using Windows.UI.Xaml.Controls;
-using Windows.UI.Xaml.Controls.Primitives;
-using Windows.UI.Xaml.Data;
-using Windows.UI.Xaml.Input;
-using Windows.UI.Xaml.Media;
-using Windows.UI.Xaml.Navigation;
-
-// The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236
-
-namespace NotificationFlyoutSample
+namespace NotificationFlyoutSample
{
- public sealed partial class Shell : UserControl
+ public sealed partial class Shell
{
public Shell()
{
- this.InitializeComponent();
+ 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;
+ }
}
}
}
diff --git a/samples/NotificationFlyoutSample/Shell.xaml b/samples/NotificationFlyoutSample/Shell.xaml
index ea95ba1..9101dd5 100644
--- a/samples/NotificationFlyoutSample/Shell.xaml
+++ b/samples/NotificationFlyoutSample/Shell.xaml
@@ -6,6 +6,9 @@
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
IconSource="/Assets/Icon.ico"
LightIconSource="/Assets/Icon-Light.ico">
+
+
+
false
+
+
+
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
diff --git a/src/NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/ContextMenuFlyoutHost.cs b/src/NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/ContextMenuFlyoutHost.cs
new file mode 100644
index 0000000..5d0a280
--- /dev/null
+++ b/src/NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/ContextMenuFlyoutHost.cs
@@ -0,0 +1,34 @@
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Controls.Primitives;
+
+namespace NotificationFlyout.Uwp.UI.Controls
+{
+ internal class ContextMenuFlyoutHost : Control
+ {
+ private Grid _root;
+
+ public ContextMenuFlyoutHost()
+ {
+ DefaultStyleKey = typeof(ContextMenuFlyoutHost);
+ }
+
+ public void ShowFlyout()
+ {
+ if (_root == null) return;
+ var flyout = FlyoutBase.GetAttachedFlyout(_root);
+ flyout.ShowAt(_root, new FlyoutShowOptions { Placement = FlyoutPlacementMode.BottomEdgeAlignedLeft, ShowMode = FlyoutShowMode.TransientWithDismissOnPointerMoveAway });
+ }
+
+ public void HideFlyout()
+ {
+ if (_root == null) return;
+ var flyout = FlyoutBase.GetAttachedFlyout(_root);
+ flyout.Hide();
+ }
+
+ protected override void OnApplyTemplate()
+ {
+ _root = GetTemplateChild("Root") as Grid;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/ContextMenuFlyoutHost.xaml b/src/NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/ContextMenuFlyoutHost.xaml
new file mode 100644
index 0000000..418315b
--- /dev/null
+++ b/src/NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/ContextMenuFlyoutHost.xaml
@@ -0,0 +1,20 @@
+
+
+
\ No newline at end of file
diff --git a/src/NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/NotificationFlyout.cs b/src/NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/NotificationFlyout.cs
index 4d38f86..17b6c27 100644
--- a/src/NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/NotificationFlyout.cs
+++ b/src/NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/NotificationFlyout.cs
@@ -1,5 +1,9 @@
using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Markup;
using Windows.UI.Xaml.Media;
@@ -28,9 +32,19 @@ namespace NotificationFlyout.Uwp.UI.Controls
typeof(UIElement), typeof(NotificationFlyout),
new PropertyMetadata(null, OnContentPropertyChanged));
+ public static DependencyProperty ContextMenuItemsProperty =
+ DependencyProperty.Register(nameof(ContextMenuItems),
+ typeof(IList), typeof(NotificationFlyout),
+ new PropertyMetadata(null));
+
internal event EventHandler ContentChanged;
- internal event EventHandler RequestedThemeChanged;
internal event EventHandler IconSourceChanged;
+ internal event EventHandler RequestedThemeChanged;
+
+ public NotificationFlyout()
+ {
+ ContextMenuItems = new ObservableCollection();
+ }
public UIElement Content
{
@@ -38,6 +52,12 @@ namespace NotificationFlyout.Uwp.UI.Controls
set => SetValue(ContentProperty, value);
}
+ public IList ContextMenuItems
+ {
+ get => (IList)GetValue(ContextMenuItemsProperty);
+ set => SetValue(ContextMenuItemsProperty, value);
+ }
+
public ImageSource IconSource
{
get => (ImageSource)GetValue(IconSourceProperty);
diff --git a/src/NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/NotificationFlyoutHost.cs b/src/NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/NotificationFlyoutHost.cs
index 8af2415..6d533f2 100644
--- a/src/NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/NotificationFlyoutHost.cs
+++ b/src/NotificationFlyout.Uwp.UI.Controls/NotificationFlyout/NotificationFlyoutHost.cs
@@ -6,7 +6,7 @@ using Windows.UI.Xaml.Media;
namespace NotificationFlyout.Uwp.UI.Controls
{
- public class NotificationFlyoutHost : Control
+ internal class NotificationFlyoutHost : Control
{
public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register(nameof(Content),
diff --git a/src/NotificationFlyout.Uwp.UI.Controls/Themes/Generic.xaml b/src/NotificationFlyout.Uwp.UI.Controls/Themes/Generic.xaml
index 3c597f0..2052801 100644
--- a/src/NotificationFlyout.Uwp.UI.Controls/Themes/Generic.xaml
+++ b/src/NotificationFlyout.Uwp.UI.Controls/Themes/Generic.xaml
@@ -2,5 +2,6 @@
+
\ No newline at end of file
diff --git a/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout - Backup.Wpf.UI.Controls.csproj b/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout - Backup.Wpf.UI.Controls.csproj
new file mode 100644
index 0000000..607c21f
--- /dev/null
+++ b/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout - Backup.Wpf.UI.Controls.csproj
@@ -0,0 +1,25 @@
+
+
+
+ netcoreapp3.1
+ true
+ uap10.0.19041
+ AnyCPU;x64
+ NU1702
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutApplication.cs b/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutApplication.cs
index 337fe2b..6e9b064 100644
--- a/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutApplication.cs
+++ b/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutApplication.cs
@@ -11,11 +11,11 @@ namespace NotificationFlyout.Wpf.UI.Controls
typeof(Uwp.UI.Controls.NotificationFlyout), typeof(NotificationFlyoutApplication),
new PropertyMetadata(null, OnFlyoutPropertyChanged));
- private readonly NotificationFlyoutXamlHost _xamlHost;
+ private readonly NotificationFlyoutXamlHostWindow _xamlHost;
public NotificationFlyoutApplication()
{
- _xamlHost = new NotificationFlyoutXamlHost();
+ _xamlHost = new NotificationFlyoutXamlHostWindow();
_xamlHost.Show();
}
diff --git a/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutContextMenuXamlHost.cs b/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutContextMenuXamlHost.cs
new file mode 100644
index 0000000..67e836d
--- /dev/null
+++ b/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutContextMenuXamlHost.cs
@@ -0,0 +1,38 @@
+using NotificationFlyout.Uwp.UI.Controls;
+using NotificationFlyout.Wpf.UI.Extensions;
+using NotificationFlyout.Wpf.UI.Helpers;
+using System;
+
+namespace NotificationFlyout.Wpf.UI.Controls
+{
+ internal class ContextMenuXamlHost : XamlHostWindow
+ {
+ public ContextMenuXamlHost()
+ {
+ Topmost = true;
+ }
+
+ protected override void OnDeactivated(EventArgs args)
+ {
+ var flyoutHost = GetHostContent();
+ if (flyoutHost != null)
+ {
+ flyoutHost.HideFlyout();
+ }
+ }
+
+ public void ShowContextMenuFlyout()
+ {
+ var position = CursorHelper.GetPhysicalCursorPos();
+ this.SetWindowPosition(position.y, position.x, WindowSize, WindowSize);
+
+ var flyoutHost = GetHostContent();
+ if (flyoutHost != null)
+ {
+ flyoutHost.ShowFlyout();
+ }
+
+ Activate();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutXamlHost.cs b/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutXamlHost.cs
index ca79b90..2ca5100 100644
--- a/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutXamlHost.cs
+++ b/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/NotificationFlyoutXamlHost.cs
@@ -1,32 +1,29 @@
-using Microsoft.Toolkit.Wpf.UI.XamlHost;
-using NotificationFlyout.Uwp.UI.Controls;
+using NotificationFlyout.Uwp.UI.Controls;
using NotificationFlyout.Wpf.UI.Extensions;
using NotificationFlyout.Uwp.UI.Extensions;
using NotificationFlyout.Wpf.UI.Helpers;
using System;
using System.Windows;
-using System.Windows.Media;
using Windows.UI.Xaml.Controls.Primitives;
+using System.Windows.Input;
namespace NotificationFlyout.Wpf.UI.Controls
{
- internal class NotificationFlyoutXamlHost : Window
+ internal class NotificationFlyoutXamlHostWindow : XamlHostWindow
{
private const string ShellTrayHandleName = "Shell_TrayWnd";
- private const double WindowSize = 5;
+ private ContextMenuXamlHost _contextMenuXamlHost;
private Uwp.UI.Controls.NotificationFlyout _flyout;
+
private bool _isLoaded;
+
private NotificationIconHelper _notificationIconHelper;
private SystemPersonalisationHelper _systemPersonalisationHelper;
private TaskbarHelper _taskbarHelper;
- private WindowsXamlHost _xamlHost;
- public NotificationFlyoutXamlHost()
+ public NotificationFlyoutXamlHostWindow()
{
- PrepareDefaultWindow();
- PrepareWindowsXamlHost();
-
Loaded += OnLoaded;
}
@@ -51,7 +48,7 @@ namespace NotificationFlyout.Wpf.UI.Controls
internal void HideFlyout()
{
- var flyoutHost = GetFlyoutHost();
+ var flyoutHost = GetHostContent();
if (flyoutHost != null)
{
flyoutHost.HideFlyout();
@@ -60,7 +57,7 @@ namespace NotificationFlyout.Wpf.UI.Controls
internal void ShowFlyout()
{
- var flyoutHost = GetFlyoutHost();
+ var flyoutHost = GetHostContent();
if (flyoutHost != null)
{
var taskbarState = _taskbarHelper.GetCurrentState();
@@ -78,10 +75,9 @@ namespace NotificationFlyout.Wpf.UI.Controls
}
}
- private NotificationFlyoutHost GetFlyoutHost()
+ protected override void OnDeactivated(EventArgs args)
{
- if (_xamlHost == null) return null;
- return _xamlHost.GetUwpInternalObject() as NotificationFlyoutHost;
+ HideFlyout();
}
private void OnFlyoutContentChanged(object sender, EventArgs args)
@@ -101,7 +97,15 @@ namespace NotificationFlyout.Wpf.UI.Controls
private void OnIconInvoked(object sender, NotificationIconInvokedEventArgs args)
{
- ShowFlyout();
+ if (args.MouseButton == MouseButton.Left)
+ {
+ ShowFlyout();
+ }
+
+ if (args.MouseButton == MouseButton.Right)
+ {
+ ShowContextMenuFlyout();
+ }
}
private void OnLoaded(object sender, RoutedEventArgs args)
@@ -112,7 +116,6 @@ namespace NotificationFlyout.Wpf.UI.Controls
_isLoaded = true;
UpdateWindow();
- this.Hidden();
}
private void OnTaskbarChanged(object sender, EventArgs args)
@@ -125,20 +128,11 @@ namespace NotificationFlyout.Wpf.UI.Controls
UpdateIcons();
}
- private void PrepareDefaultWindow()
- {
- ShowInTaskbar = false;
- ShowActivated = false;
- WindowStyle = WindowStyle.None;
- ResizeMode = ResizeMode.NoResize;
- AllowsTransparency = true;
- Background = new SolidColorBrush(Colors.Transparent);
- Height = WindowSize;
- Width = WindowSize;
- }
-
private void PrepareNotificationIcon()
{
+ _contextMenuXamlHost = new ContextMenuXamlHost();
+ _contextMenuXamlHost.Show();
+
_notificationIconHelper = NotificationIconHelper.Create(this);
_notificationIconHelper.IconInvoked += OnIconInvoked;
@@ -151,20 +145,9 @@ namespace NotificationFlyout.Wpf.UI.Controls
_taskbarHelper = TaskbarHelper.Create(this);
_taskbarHelper.TaskbarChanged += OnTaskbarChanged;
}
-
- private void PrepareWindowsXamlHost()
+ private void ShowContextMenuFlyout()
{
- _xamlHost = new WindowsXamlHost
- {
- InitialTypeName = typeof(NotificationFlyoutHost).FullName
- };
-
- _xamlHost.Height = 0;
- _xamlHost.Width = 0;
- _xamlHost.HorizontalAlignment = HorizontalAlignment.Stretch;
- _xamlHost.VerticalAlignment = VerticalAlignment.Stretch;
-
- Content = _xamlHost;
+ _contextMenuXamlHost.ShowContextMenuFlyout();
}
private void UpdateFlyoutContent()
@@ -174,7 +157,7 @@ namespace NotificationFlyout.Wpf.UI.Controls
var content = _flyout.Content;
if (content == null) return;
- var flyoutHost = GetFlyoutHost();
+ var flyoutHost = GetHostContent();
if (flyoutHost != null)
{
flyoutHost.Content = content;
@@ -208,7 +191,7 @@ namespace NotificationFlyout.Wpf.UI.Controls
var requestedTheme = _flyout.RequestedTheme;
- var flyoutHost = GetFlyoutHost();
+ var flyoutHost = GetHostContent();
if (flyoutHost != null)
{
flyoutHost.RequestedTheme = requestedTheme;
@@ -219,7 +202,7 @@ namespace NotificationFlyout.Wpf.UI.Controls
{
if (!_isLoaded) return;
- var flyoutHost = GetFlyoutHost();
+ var flyoutHost = GetHostContent();
if (flyoutHost == null) return;
var taskbarState = _taskbarHelper.GetCurrentState();
@@ -231,7 +214,7 @@ namespace NotificationFlyout.Wpf.UI.Controls
var windowHeight = WindowSize * this.DpiY();
double top, left, height, width;
-
+
var taskbarRect = taskbarState.Rect;
switch (taskbarState.Position)
{
diff --git a/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/XamlHostWindow.cs b/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/XamlHostWindow.cs
new file mode 100644
index 0000000..91b3e96
--- /dev/null
+++ b/src/NotificationFlyout.Wpf.UI.Controls/NotificationFlyout/XamlHostWindow.cs
@@ -0,0 +1,60 @@
+using Microsoft.Toolkit.Wpf.UI.XamlHost;
+using NotificationFlyout.Wpf.UI.Extensions;
+using System.Windows;
+using System.Windows.Media;
+
+namespace NotificationFlyout.Wpf.UI.Controls
+{
+ internal class XamlHostWindow : Window where TXamlContent : class
+ {
+ internal const double WindowSize = 5;
+ private WindowsXamlHost _xamlHost;
+
+ public XamlHostWindow()
+ {
+ PrepareDefaultWindow();
+ PrepareWindowsXamlHost();
+
+ Loaded += OnLoaded;
+ }
+
+
+ internal TXamlContent GetHostContent()
+ {
+ if (_xamlHost == null) return null;
+ return _xamlHost.GetUwpInternalObject() as TXamlContent;
+ }
+
+ private void OnLoaded(object sender, RoutedEventArgs args)
+ {
+ this.Hidden();
+ }
+
+ private void PrepareDefaultWindow()
+ {
+ ShowInTaskbar = false;
+ ShowActivated = false;
+ WindowStyle = WindowStyle.None;
+ ResizeMode = ResizeMode.NoResize;
+ AllowsTransparency = true;
+ Background = new SolidColorBrush(Colors.Red);
+ Height = WindowSize;
+ Width = WindowSize;
+ }
+
+ private void PrepareWindowsXamlHost()
+ {
+ _xamlHost = new WindowsXamlHost
+ {
+ InitialTypeName = typeof(TXamlContent).FullName
+ };
+
+ _xamlHost.Height = 0;
+ _xamlHost.Width = 0;
+ _xamlHost.HorizontalAlignment = HorizontalAlignment.Stretch;
+ _xamlHost.VerticalAlignment = VerticalAlignment.Stretch;
+
+ Content = _xamlHost;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/NotificationFlyout.Wpf.UI/Helpers/CursorHelper.cs b/src/NotificationFlyout.Wpf.UI/Helpers/CursorHelper.cs
new file mode 100644
index 0000000..536041f
--- /dev/null
+++ b/src/NotificationFlyout.Wpf.UI/Helpers/CursorHelper.cs
@@ -0,0 +1,13 @@
+using Microsoft.Windows.Sdk;
+
+namespace NotificationFlyout.Wpf.UI.Helpers
+{
+ internal class CursorHelper
+ {
+ public static POINT GetPhysicalCursorPos()
+ {
+ PInvoke.GetPhysicalCursorPos(out POINT point);
+ return point;
+ }
+ }
+}
diff --git a/src/NotificationFlyout.Wpf.UI/Helpers/WindowHelper.cs b/src/NotificationFlyout.Wpf.UI/Helpers/WindowHelper.cs
index 4e741cd..03ff11b 100644
--- a/src/NotificationFlyout.Wpf.UI/Helpers/WindowHelper.cs
+++ b/src/NotificationFlyout.Wpf.UI/Helpers/WindowHelper.cs
@@ -1,5 +1,5 @@
-using Microsoft.Windows.Sdk;
-using System;
+using System;
+using Microsoft.Windows.Sdk;
namespace NotificationFlyout.Wpf.UI.Helpers
{
diff --git a/src/NotificationFlyout.Wpf.UI/NativeMethods.txt b/src/NotificationFlyout.Wpf.UI/NativeMethods.txt
index d1279bd..f4fe388 100644
--- a/src/NotificationFlyout.Wpf.UI/NativeMethods.txt
+++ b/src/NotificationFlyout.Wpf.UI/NativeMethods.txt
@@ -1,13 +1,13 @@
Shell_NotifyIcon
-GetDpiForWindow
-FindWindow
GetSystemMetricsForDpi
DefWindowProcW
GetSystemMetrics
MonitorFromWindow
RegisterWindowMessage
-FindWindow
SHAppBarMessage
SetWindowPos
GetWindowLong
-SetWindowLong
\ No newline at end of file
+SetWindowLong
+GetDpiForWindow
+FindWindow
+GetPhysicalCursorPos
\ No newline at end of file
diff --git a/src/NotificationFlyout.Wpf.UI/Properties/AssemblyInfo.cs b/src/NotificationFlyout.Wpf.UI/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..f194f50
--- /dev/null
+++ b/src/NotificationFlyout.Wpf.UI/Properties/AssemblyInfo.cs
@@ -0,0 +1,3 @@
+using System.Runtime.CompilerServices;
+
+[assembly: InternalsVisibleTo("NotificationFlyout.Wpf.UI.Controls")]
\ No newline at end of file
diff --git a/src/NotificationFlyout.Wpf.UI/Screen.cs b/src/NotificationFlyout.Wpf.UI/Screen.cs
index 9a294df..f08f35b 100644
--- a/src/NotificationFlyout.Wpf.UI/Screen.cs
+++ b/src/NotificationFlyout.Wpf.UI/Screen.cs
@@ -88,6 +88,7 @@ namespace NotificationFlyout.Wpf.UI
return monitorData;
}
+
private Rect GetWorkingArea()
{
if (!_multiMonitorSupport || _monitorHandle == (IntPtr)PRIMARY_MONITOR)
diff --git a/src/NotificationFlyout.sln b/src/NotificationFlyout.sln
index 49a5979..19d529b 100644
--- a/src/NotificationFlyout.sln
+++ b/src/NotificationFlyout.sln
@@ -14,7 +14,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
global.json = global.json
EndProjectSection
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotificationFlyout.Uwp.UI", "NotificationFlyout.Uwp.UI\NotificationFlyout.Uwp.UI.csproj", "{3FE0D7F7-1173-4989-BE6C-AD28FE0D4AC9}"
+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