【问题标题】:WPF Parent UserControl cannot locate resource, thats beeing used in child UserControlWPF 父用户控件无法找到正在子用户控件中使用的资源
【发布时间】:2022-07-21 17:10:21
【问题描述】:

我在一个问题的一部分中偶然发现了两个例外。但是,我认为这个比另一个更重要,这让我有点困惑,所以如果能帮助我摆脱这个错误,我将不胜感激。

总之 - 我有一个用户控件显示给用户,它有 TabControl。对于每个TabItem,我添加了其他UserControls。其中一个控件显示 xaml 资源以显示图像(将它们从 SVG 转换为 xaml,因为常规的 PNG/etc 分辨率看起来不太好)。相同的资源在“原始”UserControl 上显示正常,并且在我需要时使用路径和打包 uri(这是同一个程序集)似乎可以找到并显示资源。不幸的是,当我引用 UserControl 在父 UserControl 中使用因此资源时,它会引发错误 - 'XDG0062 Cannot locate resource 'global%20objects/pictures/user%20controls/icon.xaml' em>' 以及实际上成功使用相同资源的祖父母(原始)UserControl

在调试代码和重建期间,我没有收到错误,并且两者都没有中断,但它不断重复发生。

我正在尝试向实际被破坏的东西显示最少的代码。

图标:(甲骨文)

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Viewbox xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Stretch="Uniform"
             x:Key="Icon">
        <Canvas Name="svg16" Width="512.000000" Height="512.000000">
            <Canvas.RenderTransform>
                <TranslateTransform X="0" Y="0"/>
            </Canvas.RenderTransform>
            <Canvas.Resources/>
            <Canvas Name="g14">
                <Canvas.RenderTransform>
                    <TransformGroup>
                        <ScaleTransform ScaleX="0.100000" ScaleY="-0.100000"/>
                        <TranslateTransform X="0.000000" Y="512.000000"/>
                    </TransformGroup>
                </Canvas.RenderTransform>
                <Path xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="path12" Fill="DarkRed">
                    <Path.Data>
                        <PathGeometry Figures="M1440 4169 c-257 -30 -504 -120 -725 -266 -137 -91 -347 -301 -438 -438 -499 -756 -304 -1749 443 -2250 219 -147 462 -234 735 -265 121 -13 2089 -13 2210 0 561 63 1035 390 1282 885 263 525 224 1133 -104 1630 -91 137 -301 347 -438 438 -228 150 -466 236 -740 267 -111 12 -2117 11 -2225 -1z m2173 -574 c621 -94 1021 -708 856 -1316 -30 -113 -118 -282 -197 -379 -162 -200 -401 -336 -659 -375 -145 -22 -1961 -22 -2106 0 -263 40 -499 174 -663 379 -75 93 -164 266 -193 375 -65 239 -44 496 59 718 148 317 447 544 788 598 134 20 1977 21 2115 0z" FillRule="NonZero"/>
                    </Path.Data>
                </Path>
            </Canvas>
        </Canvas>
    </Viewbox>
</ResourceDictionary>

祖父 UserControl:资源

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="\global objects\pictures\user controls\Icon.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

祖父 UserControl:TabControl 这里我在第二项 &lt;local:ManualMatch/&gt; 上遇到错误,但显示为标题的相同图标很好。

            <TabItem>
                <TabItem.Header>
                    <StackPanel Width="auto"
                                Height="auto">
                        <ContentControl Content="{StaticResource Icon}"
                                        Width="50"/>
                    </StackPanel>
                </TabItem.Header>
                <!--element not important-->
            </TabItem>
            <TabItem>
                <local:ManualMatch Margin="0 20"/>
            </TabItem>

父用户控件:ScrollViewer 在这里,我正在使用另一个引用相同图标资源的用户控件。上面写的错误在DataTemplate 处抛出。这里没有添加资源,但我试过了,一点帮助都没有。

    <ScrollViewer>
        <ItemsControl ItemsSource="{Binding PossibleMatches}">
            <DataTemplate>
                <local:ManualMatchItem/>
            </DataTemplate>
        </ItemsControl>
    </ScrollViewer>

孙子/最低用户控制:资源 在这里我尝试了PackUri以及常规路径,都可以正常工作并显示项目,但再次出现错误。

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="\global objects\pictures\user controls\Icon.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

孙子/最低用户控件:ContentControl 这也可以正常工作,并且如上所述,所有内容都会显示,但会再次出现错误。

<StackPanel Orientation="Horizontal">
    <ContentControl Content="{StaticResource Icon}"
                    Width="35"/>
</StackPanel>

【问题讨论】:

  • 一个问题是你有一些 ui 作为资源。这是个坏主意。这样,您一次只能在一个地方使用它们。这也是你在那里得到的一个 vrry 笨重的实现。您应该将几何图形放在资源中。将这些用作您想要每个图标的路径的数据。
  • 出于兴趣,您所说的“笨拙的实现”是什么意思,因为正如我所说,这些是 xaml 的一部分。我假设您在谈论图标实现?你能告诉我你的意思吗:)
  • Viewbox 是一个控件。看起来你正在尝试使用Viewbox+Canvas+Path 创建一个图标的矢量图形并在多个地方使用它。但是将“控制”作为“资源”通常是一个坏主意。因为资源通常被设计为“可重用”,但控件有父级,它一次只能停留在一个地方,控件不能重用。尝试将其更改为DrawingBrush+GeometryDrawing。 WPF 的优点和缺点都是“条条大路通罗马”——但是道路太多了,其中一些是错误的。
  • 我遵循了这个建议,但我仍然遇到同样的错误,它只是让 xaml 更具可读性:)

标签: c# wpf xaml user-controls


【解决方案1】:

好的,xaml 存在问题,我刚刚注意到了。虽然我也跟进了 cmets 中的建议,并将图标转移到 DrawingBrushDrawingGeometry。所以,从这个线程中产生了一些好的东西。尽管我很惭愧没有注意到这一点。

这里的物品控制,那是万恶之源,里面没有ItemsControl.ItemTemplate

添加错误后清除...

    <ScrollViewer>
        <ItemsControl ItemsSource="{Binding PossibleMatches}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <ContentControl Content="{StaticResource ManualMatchItem}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多