【问题标题】:Xamarin Forms use different resource dictionaries for different build configurationsXamarin Forms 对不同的构建配置使用不同的资源字典
【发布时间】:2020-11-10 13:19:02
【问题描述】:

我正在尝试在我的 Xamarin Forms 应用中为不同的构建配置(调试、发布等)加载不同的资源字典。

我尝试在运行时设置源属性,但没有成功(为无效 uri 抛出错误)

public App()
{
        InitializeComponent();
        Device.SetFlags(new string[] { "Expander_Experimental", "Shapes_Experimental" });
        mainResourceDict.Source = new Uri("ResourceDictionaries/WebtrieveRD.xaml");
}

我找不到在 XAML 中添加编译器指令条件的方法。有没有其他方法可以做到这一点?

【问题讨论】:

  • 所以您是在尝试动态加载 XAML 源?
  • @GabrielStancu 我是,但我认为我没有以正确的方式接近它。不知道该怎么做或我错过了什么。
  • 那请具体点,你到底想达到什么目的?
  • 我有多个 xaml 资源 dict 文件,我需要根据构建配置加载它们

标签: c# .net xaml xamarin.forms resourcedictionary


【解决方案1】:

所以,经过一番研究,我认为这可能会解决您的问题。为了确定您是在发布还是调试,您必须在项目的构建页面中插入常量。您转到项目文件(右键单击项目)-> 配置属性-> 构建-> 条件编译符号并选中“定义调试”选项。现在你已经标记了,你可以使用类似的东西:

#if DEBUG
        ExecDebugMethod();
#else
        ExecReleaseMethod();
#endif

现在,在能够加载字典文件之前,您还需要执行以下“准备”步骤:

  1. 在您的项目中创建文件夹。从您的编辑中我可以注意到,您已经完成了这项工作,并将其命名为 ResourceDictionaries。
  2. 将 XAML 文件添加到 ResourceDictionaries 文件夹。 (DebugXAML 和 ReleaseXAML)
  3. 右键单击 XAML 文件并选择属性。将 Build Action 的值设置为“Embedded Resource”。
  4. 右键单击项目并选择属性。记下默认命名空间值。我们将使用它作为路径的一部分。对于此示例,我们假设它是“MyNamespace”。

现在您已成功确定您是在发布模式还是调试模式下运行并且前面的步骤已完成,下面显示了每个方法的代码,以动态加载每种构建类型所需的字典:

ResourceDictionary dict = new ResourceDictionary(); 
System.Windows.Application.LoadComponent(dict, 
  new System.Uri("/MyNamespace;ResourceDictionaries/DebugXAML.xaml",
  System.UriKind.Relative));

但请注意,这种提供字典路径的方式是相对于您的文件夹位置而言的。如果这不能解决您的问题或我理解错误,请告诉我,我会更新我的答案。

【讨论】:

  • 嘿,由于您编写的语法是特定于 Windows 的,因此我为 Xamarin 表单应用程序修改了它,例如 dict.Source = new Uri("ResourceDictionaries/WebtrieveRD.xaml", UriKind.Relative); 但它会引发错误“System.InvalidOperationException: 'Source can only be set from XAML. '"
  • 编辑了我的答案。您可能也不需要程序集/命名空间,但这就是文档示例为我提供的内容。
【解决方案2】:

好的,所以我发现 ResourceDictionary 的源只能从 XAML 设置(根据 Xamarin 文档)。但它有一个名为SetAndLoadSource 的方法,标记为For internal use by Xamarin Platform,但仍可用于从后面的代码动态设置源。这是一个用法示例:

#if DEBUG
            var source = new Uri("ResourceDictionaries/DebugRD.xaml", UriKind.RelativeOrAbsolute);
            mainResourceDict.SetAndLoadSource(source, "ResourceDictionaries/DebugRD.xaml", this.GetType().GetTypeInfo().Assembly, null);
#endif

【讨论】:

  • 你可以标记这个答案,这将帮助更多有同样问题的人:)。
  • @JackHua-MSFT 是的,我不得不等待 2 天才能做到这一点。现在完成,谢谢!
猜你喜欢
  • 2018-05-28
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
相关资源
最近更新 更多