提问人:GChapX 提问时间:11/16/2023 更新时间:11/16/2023 访问量:51
在 .Net MAUI 中使用共享的 xaml 样式资源
Using shared xaml style resources in .Net MAUI
问:
这里没有太多的代码问题,但有一些结构和理解问题。我试图实现的是让 Style 资源在不同的项目之间共享。
我在同一 Visual Studio 解决方案中有两个具有相同结构的 .Net MAUI 项目在同一解决方案中还有第三个项目 MyResources,其中包括两个项目之间的共享资源。
目前,我的两个项目的两个样式和颜色页面是相同的,我想做的是将它们移动到 MyResources 项目中,这样我就可以编辑一个样式页面。是否有可能,如果是这样,我怎样才能做到这一点?
| Project[1/2]
| | ...
| | Resources
| | | Styles
| | | | Colors.xaml
| | | | Styles.xaml
| | ...
| ...
| MyResources
| | Resources
| | | AppIcon
| | | Fonts
| | | Images
| | | ...
我可以通过在我的文件中使用以下代码来访问这些资源:Project[1/2].csproj
<ItemGroup>
<!-- App Icon -->
<MauiIcon Include="..\MyResources\Resources\AppIcon\appicon.svg" Color="#121725" />
<!-- Splash Screen -->
<MauiSplashScreen Include="..\MyResources\Resources\Splash\splash.svg" Color="#121725" BaseSize="128,128" />
<!-- Images -->
<MauiImage Include="..\MyResources\Resources\Images\*" />
<!-- Custom Fonts -->
<MauiFont Include="..\MyResources\Resources\Fonts\*" />
<!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
<MauiAsset Include="..\MyResources\Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
我尝试过什么:在几个不成功的想法之后,在我项目的 App.xaml 文件中,我尝试更改:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources/Styles/Colors.xaml" />
<ResourceDictionary Source="Resources/Styles/Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
到:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../MyResources/Resources/Styles/Colors.xaml" />
<ResourceDictionary Source="../MyResources/Resources/Styles/Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
答:
好吧,事实证明我找到了解决方案!
我需要做一些更改,通过查看文档的这一部分,我走上了正确的道路。
第一个问题是共享的 ResourceDictionary 需要有一些后台代码,以便主项目能够在外部程序集中找到它(右键单击 MyResources 项目> .NET MAUI ResourceDictionary (XAML) >添加>新元素),这样它就带有一个背景.cs文件,我们可以从以前的默认字典中复制内容)。然后,Dictionary 附带一个可以在其他项目中引用的定义。x:Class
然后,我们需要确保在我的项目中引用了 MyResource(右键单击 Project1/2 >“添加>项目引用”),并通过添加到 App.xaml 根目录来引用项目的 App.cs 文件中的程序集。xmlns:res="clr-namespace:MyResources.Resources.Styles;assembly=MyResources"
最后,我们不必尝试正确获取源代码并使用这些可疑的 URI,而只需使用 MergedDictionary 中的命名空间导入它:。pack
<res:MyDictionnary/>
我的最终 App.xaml 代码:
<?xml version = "1.0" encoding = "UTF-8" ?>
<!-- I renamed my namespace in my shared dictionary code from MyResources.Resources.Styles to MyResources.Shared, but it works as well. -->
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Project2"
xmlns:res="clr-namespace:MyResources.Shared;assembly=MyResources"
x:Class="Project1.App">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<res:SharedColors/>
<ResourceDictionary Source="Resources/Styles/Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
问题中的 Github 存储库将更新以反映修复。
评论
<ResourceDictionary Source="pack://application:,,,/MyResources;component/Styles/Colors.xaml"/> <ResourceDictionary Source="pack://application:,,,/MyResources;component/Styles/Styles.xaml"/>