首页 > 解决方案 > 通用 xaml 文件未添加到 UWP 类库中的资源中

问题描述

所以我有一个看似简单的设置,但由于某种原因我的 UWP 应用程序没有处理我的Generic.xaml文件

我有一个以 16299 为目标的共享类库,它的最低版本是 16299。

我创建了一个Themes目录,并在它下面放了一个Generic.xaml文件,它是一个资源字典。

在这里面,我尝试添加一个样式,然后按键引用它,但 UWP 应用程序无法找到该样式。

例如

通用的.xaml

<Style TargetType="ListViewItem" x:Key="ListViewItemEvenRowStyle" >
    <Setter Property="Padding" Value="0" />
    <Setter Property="Background" Value="Black" />
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>

<Style TargetType="ListViewItem" x:Key="ListViewItemOddRowStyle" >
    <Setter Property="Padding" Value="0" />
    <Setter Property="Background" Value="White" />
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>

当我引用它时会导致此异常StaticResource

Windows.UI.Xaml.Markup.XamlParseException:'找不到与此错误代码关联的文本。

找不到具有名称/键 ListViewItemEvenRowStyle 的资源

我也尝试将其放入ResourceDictionary.ThemeResources并引用它,ThemeResource但我一直得到相同的结果。

这是 CSProj 定义

<Page Include="Themes\Generic.xaml">
  <Generator>MSBuild:Compile</Generator>
  <SubType>Designer</SubType>
</Page>

标签: c#xamluwp

解决方案


您需要使用ResourceDictionary.MergedDictionaries, 而不是 ResourceDictionary.ThemeResources。

在您的主 UWP 项目中,打开“App.xaml”文件,添加以下代码:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="YourClassLibrary/Themes/Generic.xaml"></ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

更多信息,请参阅XAML 主题资源ResourceDictionary.MergedDictionaries

[2019/7/10更新]

我很好奇 Infragistics、Telerik 和 Microsoft UWP.Toolkit 是如何做到这一点的。如果我将 Telerik 控件 dll 添加到我的项目并引用他们的控件,我不需要在我的资源字典中添加任何内容。

TelerikWindowsCommunityToolkit是开源的。你可以查看他们的源代码。这些控件是自定义控件。每个控件都有自己的样式文件,它将通过设置在控件的构造方法中应用到它DefaultStyleKey = typeof(YourCustomControlClass)

例如,Microsoft.Toolkit.Uwp.UI.Controls/Carousel/控件。您可以看到Carousel.xaml样式文件与类位于同一文件夹中Carousel.cs。在Carousel构造函数中,它用于DefaultStyleKey = typeof(Carousel);应用样式。但是仅仅通过这些步骤,系统仍然无法找到对应的样式。您可以看到Microsoft.Toolkit.Uwp.UI.Controls/Themes/文件夹,其中有一个Generic.xaml文件。它实际上是一个“资源字典”。它用于ResourceDictionary.MergedDictionaries合并不同自定义控件文件夹中的资源。

这样,主工程只需要添加对你的控件库的引用,直接使用控件就可以了,不需要ResourceDictionary.MergedDictionaries在主工程中使用。


推荐阅读