UWP беглый дизайн в XamarinForms

Я создаю решение XamarinFroms и хочу реализовать Fluent Design или его патчи в своем приложении UWP. Как вы, возможно, знаете, большинство строительных блоков 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

1 ответ

Решение

Для свободного дизайна UWP, он доступен только в UWP, вы не можете напрямую реализовать его в формах xamarin. В настоящее время 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;
            }

        }
    }
}

Другие вопросы по тегам