XAML Designer error: "IOException: Cannot locate resource" - How to provide a Pack URI that works with dynamic assembly name?

XAML Designer error: "IOException: Cannot locate resource" - How to provide a Pack URI that works with dynamic assembly name?

我们有一个ResourceDictionary被引用如下

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Theming/AppTheme.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

这在运行时效果很好。但是,Visual Studio 中的设计器在引用此 UserControl 的视图中给出错误:

IOException: Cannot locate resource 'theming/apptheme.xaml'.

其他 SO 答案建议通过指定程序集名称来引用 ResourceDictionary:

<ResourceDictionary Source="pack://application:,,,/MyDomain.MyApp.Wpf;component/Theming/AppTheme.xaml" />

这让设计者很高兴,但是我们的程序集名称在暂存和生产中是不同的,所以如果我们不必指定程序集名称就好了。我的问题是:我们如何提供让设计人员满意且不需要指定程序集名称的 ResourceDictionary 源 URI?

如果这不可能,我们可能会使用预处理器指令使 URI 成为每个构建配置都不同的静态值。

您可以使用 XAML 为您的应用定义 UI 或资源。 资源通常是您希望多次使用的某些对象的定义。稍后要引用 XAML 资源,您可以为资源指定一个键,就像它的名称一样。 您可以在整个应用程序中或从其中的任何 XAML 页面引用资源。 您可以使用 Windows 运行时 XAML 中的 ResourceDictionary 元素来定义您的资源。 然后,您可以使用 StaticResource 标记扩展或 ThemeResource 标记扩展来引用您的资源。

资源不必是字符串。 它们可以是任何可共享的对象,例如样式、模板、画笔和颜色。但是,控件、形状和其他 FrameworkElements 不可共享,因此不能将它们声明为可重用资源。

示例:

<Page.Resources>
    <x:String x:Key="key1">Hey</x:String>
    <x:String x:Key="key2">Nice</x:String>
</Page.Resources>

您可以通过在正确位置寻址密钥来使用这些资源,即:

<Label Text="{StaticResource key1}" FontSize="Large" VerticalAlignment="Center"/>

好吧,为了使您的项目更有条理,您需要将 ResourceDictionary 制作成一个单独的文件并像这样调用它(ContentPage 部分取决于页面):

<ContentPage.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Styles.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</ContentPage.Resources>

// 在这个例子中,Styles 与页面位于同一文件夹中,您可以创建动态资源以从所有区域访问它,或者以适当的方式创建路径,例如:

xmlns:themes = "clr-namespace:AppName.Themes;assembly=AppName"

我们如何才能提供让设计人员满意且不需要指定程序集名称的 ResourceDictionary 源 URI? 你做了一个动态的。 像这样:

<?xml version="1.0" encoding="utf-8" ?>
<ResourceDictionary
    x:Class="App.Themes.Theme"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Color x:Key="PrimaryColor">#ffffff</Color>
<Color x:Key="PrimaryDarkColor">#0f0f0f</Color>
</ResourceDictionary>

然后在 app.xaml 中执行此操作(如果主题位于主项目的主题文件夹中):

<Application xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:themes = "clr-namespace:YourProjectName.Themes;assembly=YourProjectName"
             x:Class="YourProjectName.App">

    <Application.Resources>

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <themes:Theme />
        </ResourceDictionary.MergedDictionaries >
    </ResourceDictionary>

</Application.Resources>

然后你就可以在任何地方做这样的事情了:

    BackgroundColor="{DynamicResource PrimaryColor}"

祝你好运!