Xamarin Forms 针对不同的构建配置使用不同的资源字典
Xamarin Forms use different resource dictionaries for different build configurations
我正在尝试在我的 Xamarin Forms 应用程序中为不同的构建配置(调试、发布等......)加载不同的资源字典。
我曾尝试在运行时设置源 属性,但没有成功(抛出无效 uri 错误)
public App()
{
InitializeComponent();
Device.SetFlags(new string[] { "Expander_Experimental", "Shapes_Experimental" });
mainResourceDict.Source = new Uri("ResourceDictionaries/WebtrieveRD.xaml");
}
我找不到在 XAML 中添加编译器指令条件的方法。有没有其他方法可以做到这一点?
因此,经过一些研究,我认为这可能会解决您的问题。为了确定您是处于发布还是调试状态,您必须在项目的构建页面中插入常量。您转到项目文件(右键单击项目)-> 配置属性 -> 构建 -> 条件编译符号并选中“定义调试”选项。现在您已经标记好了,您可以使用类似的东西:
#if DEBUG
ExecDebugMethod();
#else
ExecReleaseMethod();
#endif
现在,在能够加载字典文件之前,您还需要执行以下“准备”步骤:
- 在您的项目中创建文件夹。正如我从您的编辑中注意到的那样,您已经完成了该操作并将其命名为 ResourceDictionaries。
- 将 XAML 文件添加到 ResourceDictionaries 文件夹。 (调试XAML 和发布XAML)
- 右键单击 XAML 文件并选择属性。将生成操作的值设置为“嵌入式资源”。
- 右键单击项目并选择属性。记下默认名称空间值。我们将使用它作为路径的一部分。对于此示例,我们假设它是“MyNamespace”。
现在您已成功确定您是 运行 处于发布模式还是调试模式并且前面的步骤已完成,下面显示了每种方法的代码,以动态加载您需要的字典每种构建类型:
ResourceDictionary dict = new ResourceDictionary();
System.Windows.Application.LoadComponent(dict,
new System.Uri("/MyNamespace;ResourceDictionaries/DebugXAML.xaml",
System.UriKind.Relative));
但请注意,这种给出字典路径的方式是相对于您的文件夹位置的。如果这不能解决您的问题或者我理解有误,请告诉我,我会更新我的答案。
好的,所以我发现 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
我正在尝试在我的 Xamarin Forms 应用程序中为不同的构建配置(调试、发布等......)加载不同的资源字典。
我曾尝试在运行时设置源 属性,但没有成功(抛出无效 uri 错误)
public App()
{
InitializeComponent();
Device.SetFlags(new string[] { "Expander_Experimental", "Shapes_Experimental" });
mainResourceDict.Source = new Uri("ResourceDictionaries/WebtrieveRD.xaml");
}
我找不到在 XAML 中添加编译器指令条件的方法。有没有其他方法可以做到这一点?
因此,经过一些研究,我认为这可能会解决您的问题。为了确定您是处于发布还是调试状态,您必须在项目的构建页面中插入常量。您转到项目文件(右键单击项目)-> 配置属性 -> 构建 -> 条件编译符号并选中“定义调试”选项。现在您已经标记好了,您可以使用类似的东西:
#if DEBUG
ExecDebugMethod();
#else
ExecReleaseMethod();
#endif
现在,在能够加载字典文件之前,您还需要执行以下“准备”步骤:
- 在您的项目中创建文件夹。正如我从您的编辑中注意到的那样,您已经完成了该操作并将其命名为 ResourceDictionaries。
- 将 XAML 文件添加到 ResourceDictionaries 文件夹。 (调试XAML 和发布XAML)
- 右键单击 XAML 文件并选择属性。将生成操作的值设置为“嵌入式资源”。
- 右键单击项目并选择属性。记下默认名称空间值。我们将使用它作为路径的一部分。对于此示例,我们假设它是“MyNamespace”。
现在您已成功确定您是 运行 处于发布模式还是调试模式并且前面的步骤已完成,下面显示了每种方法的代码,以动态加载您需要的字典每种构建类型:
ResourceDictionary dict = new ResourceDictionary();
System.Windows.Application.LoadComponent(dict,
new System.Uri("/MyNamespace;ResourceDictionaries/DebugXAML.xaml",
System.UriKind.Relative));
但请注意,这种给出字典路径的方式是相对于您的文件夹位置的。如果这不能解决您的问题或者我理解有误,请告诉我,我会更新我的答案。
好的,所以我发现 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