c# - UWP 在代码隐藏中设置主题资源丙烯酸

标签 c# xaml uwp fluent-design acrylic-material

我有一个 UWP 应用,我想将其升级到流畅的设计系统。我使用 Windows Template Studio 创建了一个新项目,并且使用 Pivot 进行导航。

现在我想将丙烯酸背景放在数据透视表标题上。正如 UWP 设计指南中提到的,建议在这种情况下使用 70% 的丙烯酸。

所以我尝试使用 70% 的丙烯酸树脂和以下代码。

private void MainPivot_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
    if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.UI.Xaml.Media.AcrylicBrush"))
    {
        MainPivot.Background = Application.Current.Resources["SystemControlAltHighAcrylicWindowBrush"] as AcrylicBrush;
    }

}

其中 MainPivot 是我正在使用的枢轴,此加载方法是该枢轴的加载事件。

问题是它仅适用于浅色深色主题(取决于上次运行应用程序时设置的主题),但是当应用程序运行时我更改主题并在浅色或深色主题之间切换,这对于两个主题都效果不佳,例如,如果我将主题设置为深色,则丙烯酸颜色保持白色,并且枢轴标题文本也为白色,从而创建困惑的 UI。

此外,后备颜色也没有意义,因为浅色主题后备颜色是黑色(与黑色文本混合),而深色主题中也会出现同样的问题。

我从代码后面执行此操作的原因是因为我的应用程序的最小项目目标是创建者更新,它没有丙烯酸画笔。

最佳答案

Conditional XAML提供了一种在 XAML 标记中使用 ApiInformation.IsTypePresent 方法的方法。这使您可以根据 API 的存在设置属性并实例化标记中的对象,而无需使用隐藏代码。

要在 XAML 中使用条件方法,必须首先在页面顶部声明条件 XAML 命名空间。

xmlns:IsAcrylicBrushPresent="http://schemas.microsoft.com/winfx/2006/xaml/presentation?IsTypePresent(Windows.UI.Xaml.Media.AcrylicBrush)"
xmlns:IsAcrylicBrushNotPresent="http://schemas.microsoft.com/winfx/2006/xaml/presentation?IsTypeNotPresent(Windows.UI.Xaml.Media.AcrylicBrush)"

定义命名空间后,我们可以使用 GridBackground 属性的命名空间前缀,将其限定为应在运行时有条件设置的属性。

<Grid Name="MainPivot" IsAcrylicBrushPresent:Background="{ThemeResource SystemControlAltHighAcrylicWindowBrush}"  IsAcrylicBrushNotPresent:Background="Red">

如果设备支持AcrylicBrush,它将使用SystemControlAltHighAcrylicWindowBrush。如果没有,它将使用红色。

关于c# - UWP 在代码隐藏中设置主题资源丙烯酸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46895374/

相关文章:

c# - string url = (string)data 和 string url = data as string 之间有什么区别?

c# - 将另一个应用程序置于最前面

c# - 将转换器指定为 MarkupExtension 时在设计时出现 InvalidCastException

c# - Windows 10 UWP - 如果前台应用程序正在运行,则停止后台任务

c# - 将所有系统颜色绑定(bind)到列表框

c# - EWS foreach 所有未读邮件不起作用

c# - 在 xaml 中使用 backgroundworker 和绑定(bind)时 UI 不会更新

c# - 在文本 block 中使用具有某些属性的 <Run Text={Binding ...}/> 时应用程序崩溃

javascript - 在 UWP javascript 应用程序的 iframe 中获取 getUserMedia 的用户权限

c# - 如何使用 C# 创建复杂的 JSON 对象