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
。而下面的段代码实现AcrylicWindowBrush
为StackLayout
.
[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;
}
}
}
}
我正在创建一个 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
。而下面的段代码实现AcrylicWindowBrush
为StackLayout
.
[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;
}
}
}
}