2

我有一个 UWP 应用程序,我想将它升级到流利的设计系统。我使用 Windows Template Studio 创建了一个新项目,我的导航是使用 Pivot 进行的。

现在我想把亚克力背景放在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。

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

我之所以从后面的代码中执行此操作,是因为我的应用程序的最小项目目标是没有丙烯酸刷的创作者更新。

4

1 回答 1

4

条件 XAMLApiInformation.IsTypePresent提供了一种在 XAML 标记中使用该方法的方法。这使您可以根据 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)"

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

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

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

于 2017-10-25T08:12:53.330 回答