Xamarin Forms 中的 UWP 流畅设计

UWP fluent design in XamarinForms

我正在创建一个 XamarinFroms 解决方案,我想在我的 UWP 应用程序中实现 Fluent Design 或它的一部分。您可能知道,大多数 Fluent Design 构建基块都是 ThemeResources。所以我尝试这样做:

if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.UI.Xaml.Media.AcrylicBrush"))
            {
                var brush = Windows.UI.Xaml.Application.Current.Resources["SystemControlAltHighAcrylicWindowBrush"] as AcrylicBrush;
                var tint = brush.TintColor;
                var opacity = brush.TintOpacity;
                var fallbackColor = brush.FallbackColor;
                var source = brush.BackgroundSource;
            }

但不幸的是我得到了

System.Exception: 'Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))' on the brush creating line of code. 

如果我无法在我的 UWP 项目的代码中检索这些主题资源,我将无法访问任何预定义的画笔或者我永远无法实现显示样式

对于UWP 流畅设计,它只能在UWP 中使用,您不能直接在xamarin Forms 中实现它。目前 Xamarin Forms 还没有提供这样的接口。 =因为它是 UWP 的特定设计。并且很难抽象出一个适用于每个平台的统一接口。所以更好的方法是单独使用 Custom Renderer 实现它。例如,在您的情况下,要使 SystemControlAltHighAcrylicWindowBrush 在 Xamarin.UWP 中工作,您可以自定义 LayoutRenderer。而下面的段代码实现AcrylicWindowBrushStackLayout.

[assembly: ExportRenderer(typeof(StackLayout), typeof(ICustomStackLayoutRenderer))]

namespace CustomStackLayoutRenderer.UWP
{
    public class ICustomStackLayoutRenderer : LayoutRenderer
    {

        protected override void OnElementChanged(ElementChangedEventArgs<Layout> e)
        {
            base.OnElementChanged(e);

        }
        protected override void UpdateBackgroundColor()
        {
            base.UpdateBackgroundColor();
            if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.UI.Xaml.Media.AcrylicBrush"))
            {
                var brush = Windows.UI.Xaml.Application.Current.Resources["SystemControlAltHighAcrylicWindowBrush"] as AcrylicBrush;
                var tint = brush.TintColor;
                var opacity = brush.TintOpacity;
                var fallbackColor = brush.FallbackColor;
                var source = brush.BackgroundSource;
                this.Background = brush;
            }

        }
    }
}