我在自定义控件上有一个按钮,我正在尝试在其上显示一个图像,该图像在我的App.xaml文件中定义为资源,如下所示:
<Application.Resources>
<BitmapImage x:Key="PlusSymbol" UriSource="Resources/PlusSymbol.png" />
</Application.Resources>
出于某种原因,我无法将其用作我在Themes \ Generic.xaml文件中定义的自定义控件模板中的静态资源,它会在运行时崩溃我的应用程序,说它无法找到所请求的资源。这是我用来绑定资源的xaml代码:
<Button Grid.Row="0" Grid.Column="1" Margin="3">
<Image Source="{StaticResource PlusSymbol}"/>
</Button>
如果我在Generic.xaml文件中以完全相同的方式定义资源,它会在运行时工作,但是它给我一个预编译器警告,它无法找到该文件,因为它现在正在主题中查找它/ Resources /而不仅仅是/ Resources /。所以我在设计时得到警告,但它在运行时工作正常。
那么为什么它不能在App.xaml中定义时找到我的资源?我在常规WPF项目中以完全相同的方式执行此操作,并且它完美地工作,但在这个自定义控件库中,它给我带来了麻烦。非常感谢任何帮助!
答案 0 :(得分:2)
如果您将StaticResource
切换为DynamicResource
,那么这应该有效,以便在运行时动态评估资源而不是静态评估资源。如果您切换到DynamicResource
。
<Button Grid.Row="0" Grid.Column="1" Margin="3">
<Image Source="{DynamicResource PlusSymbol}"/>
</Button>
我认为这是因为处理基于主题的样式和模板,而不是标准资源。 This answer和this answer专门针对Generic.xaml以及它与其他ResourceDictionaries
的不同之处。
答案 1 :(得分:1)
所以我最终得到这个的方法是在Generic.xaml文件中定义BitmapImage并使用Pack URI来获取文件(here's the MSDN article about Pack URIs,这让我很困惑)。这样它就可以使用文件的相对路径,并指定它来自的程序集(该文件位于MyCustomControlLibrary项目中的\ Resources \ PlusSymbol.png,并且具有Resource的构建操作):
<BitmapImage x:Key="PlusSymbol" UriSource="pack://application:,,,/MyCustomControlLibrary;component/Resources/PlusSymbol.png" />
然后在Generic.xaml的控件模板中,我使用如下资源:
<Button Grid.Row="0" Grid.Column="1" Margin="3" Height="25" Width="25"
<Image Source="{StaticResource PlusSymbol}"/>
</Button>
请注意,我被骗了,以为我可以使用较短版本的Pack URI,如下所示:
<BitmapImage x:Key="PlusSymbol" UriSource="pack://application:,,,/Resources/PlusSymbol.png" />
然而,这仍然导致程序在运行时崩溃。我认为这是一个自定义控件库,并且图像的最终使用者是我的UI项目,这使得更长的版本指定了实际包含必要图像的程序集。
希望能帮助其他遇到类似问题的人。
注意我不认为这在技术上回答了我使用Generic.xaml中使用应用级资源(也就是在自定义控件库的App.xaml文件中定义)指定的原始问题。定义PlusSymbol资源仍会导致程序崩溃。但是我实际上并不关心在App.xaml中这样做,我只是想让它在设计时和运行时都能正常工作。这个解决方案对我有用,相当简单,从我的研究中可以看出最佳实践。