首页 > 解决方案 > 如何在 iOS 扩展中使用 Xamarin Forms 全局样式

问题描述

我的 Xamarin Forms 应用程序中有一个主题切换器,可以很好地使用一组静态资源文件。但是,我的应用程序也有一个 iOS 扩展,并且主题在那个时候崩溃了。

在主应用程序中,我将主题分配给当前应用程序的资源属性(即全局样式),并且所有视图都利用资源并在主题更改时自动更改。像这样:

Application.Current.Resources = new MyThemes.Default();

然而,在扩展中,没有“应用程序”,因为页面只是直接添加到根 UIViewController。因此,我不能使用始终为空的 Application.Current。页面工作正常,但没有应用主题。如果我在创建主题时手动将它们分配给每个页面,我就可以使用它们,尽管它不像全局样式并级联到子页面。换句话说,是这样的:

var myPage = new ContentPage();
myPage.Resources = new MyThemes.Default();
viewController = myPage.CreateViewController();

这可行,但并不完美,需要我重写当前由全局样式自动设置样式的共享视图的一部分。

我一直在四处寻找线索来实现这一点,但没有任何运气并且觉得我错过了一些东西。我发现的所有内容似乎都只是从核心应用程序点而不是扩展来谈论主题。

是否有关于在 Xamarin Forms iOS 扩展中使用主题资源和全局样式的文档或示例?任何帮助表示赞赏,谢谢!

编辑:还值得注意的是,当自定义渲染器作为扩展加载时,自定义渲染器中对 Application.Current 的引用会导致静默崩溃。这可以通过使用 BindableProperty 来解决。

标签: c#iosxamarin.formsxamarin.iosios-extensions

解决方案


在花了一些时间研究这个之后,我找到了两种可能的解决方案。

只需在创建时使用帮助程序类设置子页面的资源来获取当前主题。就像是:

var myPage = new Page()
{
     Resources = ThemeHelper.CurrentTheme()
});

您还可以在 Xamarin Forms 的 Init() 之后手动在扩展中创建应用程序,并在那里设置资源。尽管 Application 对象在技术上并不准确,但它似乎允许您按预期引用资源以进行样式设置。这实际上更好地实现了我的目标,但我还没有彻底测试它。编辑:尽管这个解决方案很奇怪,但它似乎工作得很好并且完全解决了这个问题,而无需做任何由扩展加载的特殊页面。

Application.Current = new Application();
Application.Current.Resources = ThemeHelper.CurrentTheme();

有趣的是,我确实偶然发现了一篇旧的错误帖子,其中指出 Page.CreateViewController()用于设置 Application.Current。这可能会在没有任何特殊考虑的情况下解决我的问题,但它已被修补。

这些中的任何一个似乎都足够好,但我欢迎任何其他想法。


推荐阅读