UWP 有没有办法为整个应用程序禁用 Acrylic 并始终使用后备颜色?

UWP Is there a way to disable Acrylic for the entire app and use the fallback color always?

我目前正在开发一个 UWP 应用程序,它看起来像这样,左侧面板上有 Acrylic:

现在,当我在我的笔记本电脑上启用省电模式时,亚克力被替换为它的后备颜色:

现在我想在我的应用程序设置屏幕中选择一个选项来禁用整个应用程序的亚克力,并始终使用后备颜色。但是我不确定从哪里开始。 This seems promising 但我不确定如何实现它,而不必遍历应用程序中的每个亚克力 material 并添加代码来禁用它。

是否有我可以用来执行此操作的顶级设置?谢谢

您可以将此代码放在 App.xaml 或您的 ShellPage 的资源中。

您可以根据需要设置颜色。这将覆盖默认颜色。

<SolidColorBrush x:Key="NavigationViewDefaultPaneBackground" Color="Red" />

您可以使用 CustomResource 来决定如何显示您的 AcrylicBrush:

准备

在问题描述中,您需要顶层设置来切换亚克力效果。这里可以使用LocalSettings.

Tool.cs

public class Tool
{
    public static void WriteLocalSetting(string key, object value)
    {
        var localSetting = ApplicationData.Current.LocalSettings;
        localSetting.Values[key.ToString()] = value;
    }
    public static object GetLocalSetting(string key, object defaultValue)
    {
        var localSetting = ApplicationData.Current.LocalSettings;
        bool isKeyExist = localSetting.Values.ContainsKey(key.ToString());
        if (isKeyExist)
        {
            return localSetting.Values[key.ToString()];
        }
        else
        {
            WriteLocalSetting(key, defaultValue);
            return defaultValue;
        }
    }
}

定义

根据CustomResource的文档,您需要创建一个派生的class。

public class CustomResourceLoader : CustomXamlResourceLoader
{
    protected override object GetResource(string resourceId, string objectType, string propertyName, string propertyType)
    {
        if (resourceId == "MyBackground")
        {
            bool isUseAcrylic = (bool)Tool.GetLocalSetting("IsUseAcrylic", true);
            var brush = new AcrylicBrush();
            brush.TintColor = Colors.White;
            brush.BackgroundSource = AcrylicBackgroundSource.HostBackdrop;
            brush.TintOpacity = 0.7;
            brush.FallbackColor = Colors.White;
            brush.AlwaysUseFallback = !isUseAcrylic;
            return brush;
        }
        return null;
    }
}

用法

App.xaml.cs

public App()
{
    // ...
    CustomXamlResourceLoader.Current = new CustomResourceLoader();
}

主页

<Grid Background="{CustomResource MyBackground}">
    <ToggleSwitch Toggled="ToggleSwitch_Toggled"/>
</Grid>
private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e)
{
    Tool.WriteLocalSetting("IsUseAcrylic", (sender as ToggleSwitch).IsOn);
    // Need Re-render
}

需要注意的是,在运行时切换不会影响已经渲染的元素。修改后可以弹出一个MessageDialog要求用户重启应用重新渲染

谢谢。