Xamarin.Forms 问题中的流利设计

Posted

技术标签:

【中文标题】Xamarin.Forms 问题中的流利设计【英文标题】:Fluent Design in Xamarin.Forms Issue 【发布时间】:2019-06-19 03:25:39 【问题描述】:

我正在尝试让 Fluent Design 在我的 Xamarin.Forms UWP 应用上运行。我尝试了使用渲染器、覆盖样式的不同方法,但它们都不起作用。

丙烯酸笔刷总是回退到 FallbackColor。

设置:

目标版本:Windows 10 (1803) 最低版本:Windows 10 Fall Creators Update(16299)。

我也在检查

Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.UI.Xaml.Media.AcrylicBrush") 可用。

使用任何预定义的 Acrylic 画笔都会导致“找不到具有名称/键 SystemControlChromeLowAcrylicWindowBrush 的资源”。

AcrylicBrush 和 Splitview 样式:

<media:AcrylicBrush x:Key="HostBackdropBrush"
                    BackgroundSource="HostBackdrop"
                    TintColor="White"
                    TintOpacity="0.4" 
                    FallbackColor="WhiteSmoke" />


  <Style TargetType="SplitView">
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="VerticalContentAlignment" Value="Stretch"/>
        <Setter Property="OpenPaneLength" Value="ThemeResource SplitViewOpenPaneThemeLength"/>
        <Setter Property="CompactPaneLength" Value="ThemeResource SplitViewCompactPaneThemeLength"/>
        <Setter Property="PaneBackground" Value="StaticResource HostBackdropBrush"/>
    </Style>

自定义渲染器:

[assembly: ExportRenderer(typeof(MasterPage), typeof(MasterPageRenderer))]
namespace MasterDetailPageNavigation.UWP

    class MasterPageRenderer : PageRenderer
    
        protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
        
            base.OnElementChanged(e);
            if (e.OldElement != null || Element == null)
            
                return;
            

            try
            
                if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.UI.Xaml.Media.XamlCompositionBrushBase"))
                
                    Windows.UI.Xaml.Media.AcrylicBrush myBrush = new Windows.UI.Xaml.Media.AcrylicBrush();
                    myBrush.BackgroundSource = Windows.UI.Xaml.Media.AcrylicBackgroundSource.HostBackdrop;
                    myBrush.TintColor = Windows.UI.Color.FromArgb(255, 200, 200, 200);
                    myBrush.TintOpacity = 0.2;

                    Background = myBrush;
                
                else
                
                    SolidColorBrush myBrush = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 240, 240, 240));

                    Background = myBrush;
                
            
            catch (Exception ex)
            
                System.Diagnostics.Debug.WriteLine(ex);
            
        

        protected override Windows.Foundation.Size ArrangeOverride(Windows.Foundation.Size finalSize)
        
            return base.ArrangeOverride(finalSize);
        

    

    ```


【问题讨论】:

请看一下这个项目:***.com/a/13563083/4373895 谢谢!这解决了我的问题!你能回答一下,我可以奖励你吗? 当然 iNCEPTION_ 这是个好消息 【参考方案1】:

请查看Link

这应该可以解决您的问题。您可以通过将 ThemeResources.xaml 添加到项目资源来解决此问题。

【讨论】:

【参考方案2】:

您的 AcrylicBrush 和样式对我来说效果很好。请检查“Winbdows 设置 -> 个性化 -> 颜色 -> 更多选项 -> 透明效果”。您需要开启透明效果

【讨论】:

我的开发机上开启了透明效果,其他系统应用都是透明的 请运行XamlControlsGallery sample 并检查样式 -> 亚克力 页面,看看您是否可以看到亚克力效果。 我已经构建并运行了示例,丙烯酸效果效果很好。 所以,您可以新建一个空白UWP项目,并将代码示例代码复制到该项目中进行故障排除。 问题似乎是我的特定项目,因为我无法使用新的 XF 项目重现该问题。最让我沮丧的是,没有找到像 SystemControlAcrylicWindowBrush 这样的预定义画笔,导致应用崩溃。

以上是关于Xamarin.Forms 问题中的流利设计的主要内容,如果未能解决你的问题,请参考以下文章

在 Xamarin.Forms 中将图像裁剪为正方形

如何处理 Xamarin Forms 中推送通知中的点击事件?

如何在 XAML [Xamarin.Forms] 中使用 String 以外的类型设置自定义属性值

Xamarin.Forms 与 Net.Http [关闭]

开始使用 Xamarin.Forms.Platform.Avalonia

从导航堆栈中删除页面 - xamarin.forms