在.Net MAUI中使用共享的xaml样式资源

bvjxkvbb  于 2024-01-04  发布在  .NET
关注(0)|答案(1)|浏览(205)

这里没有太多的代码问题,但有一些结构和理解问题。我试图实现的是在不同的项目之间共享样式资源。
我在同一个Visual Studio解决方案中有两个具有相同结构的.Net MAUI项目我在同一个解决方案中还有第三个项目MyResources,它包括两个项目之间的共享资源。
目前,我的两个项目的两个样式和颜色页面是相同的,我想做的是将它们移动到MyResources项目,这样我就可以有一个单一的样式页面TP编辑。这是可能的,如果是这样,我如何才能实现这一点?

  1. | Project[1/2]
  2. | | ...
  3. | | Resources
  4. | | | Styles
  5. | | | | Colors.xaml
  6. | | | | Styles.xaml
  7. | | ...
  8. | ...
  9. | MyResources
  10. | | Resources
  11. | | | AppIcon
  12. | | | Fonts
  13. | | | Images
  14. | | | ...

字符串
我可以通过在Project[1/2].csproj文件中使用以下代码访问这些资源:

  1. <ItemGroup>
  2. <!-- App Icon -->
  3. <MauiIcon Include="..\MyResources\Resources\AppIcon\appicon.svg" Color="#121725" />
  4. <!-- Splash Screen -->
  5. <MauiSplashScreen Include="..\MyResources\Resources\Splash\splash.svg" Color="#121725" BaseSize="128,128" />
  6. <!-- Images -->
  7. <MauiImage Include="..\MyResources\Resources\Images\*" />
  8. <!-- Custom Fonts -->
  9. <MauiFont Include="..\MyResources\Resources\Fonts\*" />
  10. <!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
  11. <MauiAsset Include="..\MyResources\Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
  12. </ItemGroup>


我的尝试:在几个不成功的想法之后,在我的项目的App.xaml文件中,我尝试改变:

  1. <Application.Resources>
  2. <ResourceDictionary>
  3. <ResourceDictionary.MergedDictionaries>
  4. <ResourceDictionary Source="Resources/Styles/Colors.xaml" />
  5. <ResourceDictionary Source="Resources/Styles/Styles.xaml" />
  6. </ResourceDictionary.MergedDictionaries>
  7. </ResourceDictionary>
  8. </Application.Resources>


进入:

  1. <Application.Resources>
  2. <ResourceDictionary>
  3. <ResourceDictionary.MergedDictionaries>
  4. <ResourceDictionary Source="../MyResources/Resources/Styles/Colors.xaml" />
  5. <ResourceDictionary Source="../MyResources/Resources/Styles/Styles.xaml" />
  6. </ResourceDictionary.MergedDictionaries>
  7. </ResourceDictionary>
  8. </Application.Resources>


编辑:我已经添加了一个minimal reproductible example的情况下,基于基本的毛伊岛项目,我试图使用样式的按钮从MyResource项目,而不是应用程序项目本身。

mctunoxg

mctunoxg1#

好吧,我找到解决办法了!
我需要做一些修改,我通过查看这部分文档走上了正确的道路。
第一个问题是共享的ResourceDictionary需要有一些后台代码,以便主项目能够在外部程序集中找到它(* 右键点击MyResources项目> Add > New element > .NET MAUI ResourceDictionary(XAML),这样就自带了一个后台.cs文件,我们可以从以前的默认字典中复制内容)。然后字典带有一个定义的x:Class,可以在其他项目中引用。
然后,我们需要确保MyResource在我的项目中被引用
右键单击Project 1/2 > Add > Project reference*),并通过将xmlns:res="clr-namespace:MyResources.Resources.Styles;assembly=MyResources"添加到App.xaml根目录中,引用我的项目的App.cs文件中的程序集
最后,我们不必尝试正确获取源代码并使用这些可疑的pack URI,只需使用MergedDictionary:<res:MyDictionnary/>中的命名空间**导入它。
我的最终App.xaml代码:

  1. <?xml version = "1.0" encoding = "UTF-8" ?>
  2. <!-- I renamed my namespace in my shared dictionary code from MyResources.Resources.Styles to MyResources.Shared, but it works as well. -->
  3. <Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
  4. xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
  5. xmlns:local="clr-namespace:Project2"
  6. xmlns:res="clr-namespace:MyResources.Shared;assembly=MyResources"
  7. x:Class="Project1.App">
  8. <Application.Resources>
  9. <ResourceDictionary>
  10. <ResourceDictionary.MergedDictionaries>
  11. <res:SharedColors/>
  12. <ResourceDictionary Source="Resources/Styles/Styles.xaml" />
  13. </ResourceDictionary.MergedDictionaries>
  14. </ResourceDictionary>
  15. </Application.Resources>
  16. </Application>

字符串
问题中的Github repo将更新以反映修复。

展开查看全部

相关问题