Fixed some major issues where it wasn't possible to switch the app accent based on the current system accent.

This commit is contained in:
Daniel Clark
2021-02-09 13:10:23 +00:00
parent 085e632eb9
commit fae7721b5f
7 changed files with 21 additions and 101 deletions
@@ -1,4 +1,4 @@
<controls:NotificationFlyoutPresenter <UserControl
x:Class="NotificationFlyout.Sample.Uwp.NotificationFlyoutPresenter" x:Class="NotificationFlyout.Sample.Uwp.NotificationFlyoutPresenter"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
@@ -21,4 +21,4 @@
<ToggleButton Margin="0,0,0,8" /> <ToggleButton Margin="0,0,0,8" />
<CalendarView Margin="0,0,0,8" /> <CalendarView Margin="0,0,0,8" />
</StackPanel> </StackPanel>
</controls:NotificationFlyoutPresenter> </UserControl>
@@ -8,9 +8,9 @@ namespace NotificationFlyout.Uwp.UI.Controls
{ {
public class NotificationFlyoutHost : Control public class NotificationFlyoutHost : Control
{ {
public static readonly DependencyProperty FlyoutPresenterProperty = public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register(nameof(FlyoutPresenter), DependencyProperty.Register(nameof(Content),
typeof(NotificationFlyoutPresenter), typeof(NotificationFlyoutHost), typeof(UIElement), typeof(NotificationFlyoutHost),
new PropertyMetadata(null)); new PropertyMetadata(null));
private bool _isLoaded; private bool _isLoaded;
@@ -22,10 +22,10 @@ namespace NotificationFlyout.Uwp.UI.Controls
DefaultStyleKey = typeof(NotificationFlyoutHost); DefaultStyleKey = typeof(NotificationFlyoutHost);
} }
public NotificationFlyoutPresenter FlyoutPresenter public UIElement Content
{ {
get => (NotificationFlyoutPresenter)GetValue(FlyoutPresenterProperty); get => (UIElement)GetValue(ContentProperty);
set => SetValue(FlyoutPresenterProperty, value); set => SetValue(ContentProperty, value);
} }
public void HideFlyout() public void HideFlyout()
@@ -59,7 +59,6 @@ namespace NotificationFlyout.Uwp.UI.Controls
protected override void OnApplyTemplate() protected override void OnApplyTemplate()
{ {
_root = GetTemplateChild("Root") as Grid; _root = GetTemplateChild("Root") as Grid;
if (GetTemplateChild("ContentRoot") is Grid contentRoot) if (GetTemplateChild("ContentRoot") is Grid contentRoot)
{ {
contentRoot.Shadow = new ThemeShadow(); contentRoot.Shadow = new ThemeShadow();
@@ -54,7 +54,7 @@
FromVerticalOffset="0" /> FromVerticalOffset="0" />
</TransitionCollection> </TransitionCollection>
</Grid.Transitions> </Grid.Transitions>
<ContentControl Content="{TemplateBinding FlyoutPresenter}" /> <controls:NotificationFlyoutContentPresenter Content="{TemplateBinding Content}" />
</Grid> </Grid>
</Flyout> </Flyout>
</FlyoutBase.AttachedFlyout> </FlyoutBase.AttachedFlyout>
@@ -1,71 +1,12 @@
using System.Linq; using Windows.UI.Xaml.Controls;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace NotificationFlyout.Uwp.UI.Controls namespace NotificationFlyout.Uwp.UI.Controls
{ {
public class NotificationFlyoutPresenter : ContentControl public class NotificationFlyoutPresenter : ContentControl
{ {
private NotificationFlyoutContentPresenter _contentPresenter;
private bool _isColorPrevalence;
private ElementTheme _systemTheme;
public NotificationFlyoutPresenter() public NotificationFlyoutPresenter()
{ {
DefaultStyleKey = typeof(NotificationFlyoutPresenter); DefaultStyleKey = typeof(NotificationFlyoutPresenter);
RegisterPropertyChangedCallback(RequestedThemeProperty, RequestedThemePropertyChanged);
}
public void UpdateFlyoutTheme(string theme, bool isColorPrevalence)
{
_isColorPrevalence = isColorPrevalence;
switch (theme)
{
case "Dark":
_systemTheme = ElementTheme.Dark;
break;
case "Light":
_systemTheme = ElementTheme.Light;
break;
}
UpdateThemeVisualState();
}
protected override void OnApplyTemplate()
{
var _contentPresenter = GetTemplateChild("ContentPresenter") as NotificationFlyoutContentPresenter;
Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs args)
{
UpdateThemeVisualState();
}
private void RequestedThemePropertyChanged(DependencyObject sender, DependencyProperty dependencyProperty)
{
if (RequestedTheme == ElementTheme.Default)
{
_contentPresenter.SetValue(RequestedThemeProperty, _systemTheme);
}
else
{
_contentPresenter.SetValue(RequestedThemeProperty, RequestedTheme);
}
}
private void UpdateThemeVisualState()
{
if (_contentPresenter == null) return;
if (RequestedTheme == ElementTheme.Default)
{
_contentPresenter.SetValue(RequestedThemeProperty, _systemTheme);
}
VisualStateManager.GoToState(_contentPresenter, _isColorPrevalence ? "ColorPrevalenceTheme" : "DefaultTheme", true);
} }
} }
} }
@@ -6,10 +6,8 @@
<Setter Property="Template"> <Setter Property="Template">
<Setter.Value> <Setter.Value>
<ControlTemplate TargetType="controls:NotificationFlyoutPresenter"> <ControlTemplate TargetType="controls:NotificationFlyoutPresenter">
<controls:NotificationFlyoutContentPresenter <ContentPresenter
x:Name="ContentPresenter" x:Name="ContentPresenter"
Width="200"
Height="200"
Content="{TemplateBinding Content}" Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}" /> ContentTemplate="{TemplateBinding ContentTemplate}" />
</ControlTemplate> </ControlTemplate>
@@ -5,7 +5,7 @@ using System.Windows.Media;
namespace NotificationFlyout.Wpf.UI.Controls namespace NotificationFlyout.Wpf.UI.Controls
{ {
[ContentProperty(nameof(FlyoutPresenter))] [ContentProperty(nameof(Content))]
public class NotificationFlyout : DependencyObject public class NotificationFlyout : DependencyObject
{ {
public static readonly DependencyProperty IconSourceProperty = public static readonly DependencyProperty IconSourceProperty =
@@ -18,9 +18,9 @@ namespace NotificationFlyout.Wpf.UI.Controls
typeof(ImageSource), typeof(NotificationFlyout), typeof(ImageSource), typeof(NotificationFlyout),
new PropertyMetadata(null, OnIconPropertyChanged)); new PropertyMetadata(null, OnIconPropertyChanged));
public static DependencyProperty FlyoutPresenterProperty = public static DependencyProperty ContentProperty =
DependencyProperty.Register(nameof(FlyoutPresenter), DependencyProperty.Register(nameof(Content),
typeof(NotificationFlyoutPresenter), typeof(NotificationFlyout), typeof(Windows.UI.Xaml.UIElement), typeof(NotificationFlyout),
new PropertyMetadata(null, OnFlyoutPresenterPropertyChanged)); new PropertyMetadata(null, OnFlyoutPresenterPropertyChanged));
private readonly NotificationFlyoutXamlHost _xamlHost; private readonly NotificationFlyoutXamlHost _xamlHost;
@@ -31,10 +31,10 @@ namespace NotificationFlyout.Wpf.UI.Controls
_xamlHost.Show(); _xamlHost.Show();
} }
public NotificationFlyoutPresenter FlyoutPresenter public Windows.UI.Xaml.UIElement Content
{ {
get => (NotificationFlyoutPresenter)GetValue(FlyoutPresenterProperty); get => (Windows.UI.Xaml.UIElement)GetValue(ContentProperty);
set => SetValue(FlyoutPresenterProperty, value); set => SetValue(ContentProperty, value);
} }
public ImageSource IconSource public ImageSource IconSource
@@ -73,7 +73,7 @@ namespace NotificationFlyout.Wpf.UI.Controls
private void OnFlyoutPresenterPropertyChanged() private void OnFlyoutPresenterPropertyChanged()
{ {
_xamlHost.SetFlyoutPresenter(FlyoutPresenter); _xamlHost.SetFlyoutContent(Content);
} }
private void OnIconPropertyChanged() private void OnIconPropertyChanged()
@@ -30,17 +30,12 @@ namespace NotificationFlyout.Wpf.UI.Controls
Loaded += OnLoaded; Loaded += OnLoaded;
} }
public void SetFlyoutPresenter(NotificationFlyoutPresenter flyoutPresenter) public void SetFlyoutContent(Windows.UI.Xaml.UIElement content)
{ {
var flyoutHost = GetFlyoutHost(); var flyoutHost = GetFlyoutHost();
if (flyoutHost != null) if (flyoutHost != null)
{ {
flyoutHost.FlyoutPresenter = flyoutPresenter; flyoutHost.Content = content;
var theme = _systemPersonalisationHelper.Theme.ToString();
var isColorPrevalence = _systemPersonalisationHelper.IsColorPrevalence;
flyoutHost.FlyoutPresenter.UpdateFlyoutTheme(theme, isColorPrevalence);
} }
} }
@@ -111,22 +106,9 @@ namespace NotificationFlyout.Wpf.UI.Controls
private void OnThemeChanged(object sender, SystemPersonalisationChangedEventArgs args) private void OnThemeChanged(object sender, SystemPersonalisationChangedEventArgs args)
{ {
NewMethod(args);
UpdateIcon(); UpdateIcon();
} }
private void NewMethod(SystemPersonalisationChangedEventArgs args)
{
var flyoutHost = GetFlyoutHost();
if (flyoutHost != null)
{
var theme = args.Theme.ToString();
var isColorPrevalence = args.IsColorPrevalence;
flyoutHost.FlyoutPresenter.UpdateFlyoutTheme(theme, isColorPrevalence);
}
}
private void PrepareDefaultWindow() private void PrepareDefaultWindow()
{ {
ShowInTaskbar = false; ShowInTaskbar = false;