【发布时间】: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
这里我在第二项 <local:ManualMatch/> 上遇到错误,但显示为标题的相同图标很好。
<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