我正在尝试将一些代码提升一个级别,以便某些样式可以在视图之间共享。但是,它会中断构建并显示类似于以下内容的消息(取决于我是仅移动样式还是整个资源字典):
找不到名称/键为 ImageGridView_ItemTemplate 的资源 找不到名称/键为 ImageGridView_ItemContainerStyle 的资源
所以我的原始代码如下所示。它正在按预期工作,正在应用项目模板,并且它会构建、运行并且看起来正确。
<UserControl
x:Class="TrackingStation.Views.JobListViewPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:modelsNs="using:ModelsNamespace"
mc:Ignorable="d">
<Grid x:Name="RemoveThisTest">
<Grid Background="{ThemeResource MainBackgroundColourTheme}">
<Grid.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<DataTemplate x:Key="ImageGridView_ItemTemplate" x:DataType="ModelsNs:CheckInEvent">
<!-- The template -->
</DataTemplate>
</ResourceDictionary>
<ResourceDictionary Source="/Resources/CheckoutJobStyles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Grid.Resources>
<GridView x:Name="WorkItemGridView"
ItemsSource="{x:Bind ViewModel.SelectedResource.WorkItems, Mode=OneWay}"
ItemTemplate="{StaticResource ImageGridView_ItemTemplate}"
ItemContainerStyle="{StaticResource ImageGridView_ItemContainerStyle}"
ItemsPanel="{StaticResource ImageGridView_ItemsPanelTemplate}"
/>
</Grid>
</Grid>
</UserControl>
最初它不在资源字典等中,它只是与样式一起直接在资源中,但我将它们移出并合并了字典。
如果我将网格资源移动到嵌套了原始网格的测试网格上,那么它会继续工作。
但是,如果我向上移动一个级别到包含用户控件的网格,则会中断并显示上述错误消息。没有资源的网格看起来像这样:
<UserControl
x:Class="TrackingStation.Views.CheckoutFrame"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="using:TrackingStation.Views"
mc:Ignorable="d">
<Grid>
<local:JobListViewPanel Visibility="{x:Bind ViewModel.IsResourceSelected, Mode=OneWay}" ViewModel="{x:Bind ViewModel, Mode=OneWay}" />
<local:JobViewPanel Visibility="{x:Bind ViewModel.ShowSingleEventForm, Mode=OneWay}" ViewModel="{x:Bind ViewModel, Mode=OneWay}" />
</Grid>
</UserControl>
并添加网格资源:
<UserControl
x:Class="TrackingStation.Views.CheckoutFrame"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="using:TrackingStation.Views"
xmlns:modelsNs="using:ModelsNamespace"
mc:Ignorable="d">
<Grid>
<Grid.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<DataTemplate x:Key="ImageGridView_ItemTemplate" x:DataType="modelsNs:CheckInEvent">
<!-- the template -->
</DataTemplate>
</ResourceDictionary>
<ResourceDictionary Source="/Resources/CheckoutJobStyles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Grid.Resources>
<local:JobListViewPanel Visibility="{x:Bind ViewModel.IsResourceSelected, Mode=OneWay}" ViewModel="{x:Bind ViewModel, Mode=OneWay}" />
<local:JobViewPanel Visibility="{x:Bind ViewModel.ShowSingleEventForm, Mode=OneWay}" ViewModel="{x:Bind ViewModel, Mode=OneWay}" />
</Grid>
</UserControl>
在应用程序的最顶部,我在应用程序级别包含了大量其他样式,包括按钮样式,但是这些样式没有键,只是通用样式。
我 100% 确定我在做一些愚蠢的事情,所以我不需要别人告诉我这一点。但我的理解是,这些样式应该可供子级使用,就像在应用程序根目录定义的按钮样式影响整个程序的按钮一样。
为了完整起见,目前的样式很简单:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Style x:Key="ImageGridView_ItemContainerStyle" TargetType="GridViewItem">
<Setter Property="Background" Value="{ThemeResource SecondaryBackgroundColourTheme}"/>
<Setter Property="Margin" Value="{StaticResource DefaultMargin}"/>
</Style>
<ItemsPanelTemplate x:Key="ImageGridView_ItemsPanelTemplate">
<ItemsWrapGrid Orientation="Horizontal" HorizontalAlignment="Center"/>
</ItemsPanelTemplate>
</ResourceDictionary>
这是根据 Resource dictionaries with {x:Bind} 的 C# 解决方案。
CheckoutJobStyles.xaml
<!-- Copyright (c) Microsoft Corporation and Contributors. -->
<!-- Licensed under the MIT License. -->
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App2CSharp"
x:Class="App2CSharp.CheckoutJobStyles">
<Style x:Key="ImageGridView_ItemContainerStyle" TargetType="GridView">
</Style>
<ItemsPanelTemplate x:Key="ImageGridView_ItemsPanelTemplate">
<ItemsWrapGrid Orientation="Horizontal" HorizontalAlignment="Center"/>
</ItemsPanelTemplate>
</ResourceDictionary>
CheckoutJobStyles.cs
namespace App2CSharp
{
public partial class CheckoutJobStyles
{
public CheckoutJobStyles()
{
InitializeComponent();
}
}
}
UserControl1.xaml
<!-- Copyright (c) Microsoft Corporation and Contributors. -->
<!-- Licensed under the MIT License. -->
<UserControl
x:Class="App2CSharp.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App2CSharp"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid
Height="32"
Background="Transparent">
<Grid.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="CheckoutJobStyles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="1"
Margin="5,0,0,0"
VerticalAlignment="Center"
Text="{x:Bind Text}"
Visibility="{x:Bind l}"/>
<GridView x:Name="WorkItemGridView"
ItemContainerStyle="{StaticResource ImageGridView_ItemContainerStyle}"
ItemsPanel="{StaticResource ImageGridView_ItemsPanelTemplate}"
/>
</Grid>
</UserControl>