c# - 通用 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>
解决方案
您需要使用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 添加到我的项目并引用他们的控件,我不需要在我的资源字典中添加任何内容。
Telerik和WindowsCommunityToolkit是开源的。你可以查看他们的源代码。这些控件是自定义控件。每个控件都有自己的样式文件,它将通过设置在控件的构造方法中应用到它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
在主工程中使用。
推荐阅读
- sorbet - 有没有办法在不向每个文件添加 # 类型注释的情况下使用 Sorbet?
- c# - 如果 EXIF 数据不存在,如何读取任何图像的方向信息?
- visual-studio-code - 复制时如何设置VSCODE以增加文件名?
- beyondcompare4 - 在 Beyond Compare 中比较多个文件
- python - 如何通过总和找到一组后的最大值
- jsonschema - 使用类型:JSON 模式中的对象和属性
- google-chrome - 无法将消息从弹出窗口发送到内容
- python - 当 Numpy 数组仅包含上/下三角形中的值时,有没有办法加快它们的计算速度?
- excel - 为每张图片创建幻灯片
- cassandra - ReadRepairStage 错误消息超时