未从更高组件中找到 Winui 3 网格资源

问题描述 投票:0回答:1

我正在尝试将一些代码提升一个级别,以便某些样式可以在视图之间共享。但是,它会中断构建并显示类似于以下内容的消息(取决于我是仅移动样式还是整个资源字典):

找不到名称/键为 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>
c# windows uwp winui-3
1个回答
0
投票

我遇到了同样的问题,但没有明显的方法在 C++ 中实现它

这是根据 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>
© www.soinside.com 2019 - 2024. All rights reserved.