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

Using shared xaml style resources in .Net MAUI

提问人:GChapX 提问时间:11/16/2023 更新时间:11/16/2023 访问量:51

问:

这里没有太多的代码问题,但有一些结构和理解问题。我试图实现的是让 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>
C# XAML 毛伊 NET-8.0

评论

0赞 Alexandar May - MSFT 11/17/2023
你想要删除其他项目中的 Style 资源,并希望在不同项目之间共享它,它与可移植 XAML 样式非常相似,你可以参考它。
0赞 GChapX 11/21/2023
所以基本上,我应该改用:?我对 URI 有点困惑,直到现在才使用它们,会看看它。<ResourceDictionary Source="pack://application:,,,/MyResources;component/Styles/Colors.xaml"/> <ResourceDictionary Source="pack://application:,,,/MyResources;component/Styles/Styles.xaml"/>
0赞 GChapX 11/21/2023
我尝试了这种方式,但最终出现错误:“无效的 URI:指定的端口无效”。似乎来自“包”提到,我错过了什么吗?
0赞 Alexandar May - MSFT 11/22/2023
它可能与源 url 中的分号有关。
0赞 GChapX 11/23/2023
“组件”前的分号?我直接从文档中复制了它

答:

0赞 GChapX 12/20/2023 #1

好吧,事实证明我找到了解决方案!

我需要做一些更改,通过查看文档的这一部分,我走上了正确的道路。

第一个问题是共享的 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 存储库将更新以反映修复。