使用自定义控件库的Generic.xaml文件中的应用程序级资源

时间:2013-02-28 17:42:43

标签: wpf wpf-controls

我在自定义控件上有一个按钮,我正在尝试在其上显示一个图像,该图像在我的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项目中以完全相同的方式执行此操作,并且它完美地工作,但在这个自定义控件库中,它给我带来了麻烦。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

如果您将StaticResource切换为DynamicResource,那么这应该有效,以便在运行时动态评估资源而不是静态评估资源。如果您切换到DynamicResource

<Button Grid.Row="0" Grid.Column="1" Margin="3">
   <Image Source="{DynamicResource PlusSymbol}"/>
</Button>

我认为这是因为处理基于主题的样式和模板,而不是标准资源。 This answerthis 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中这样做,我只是想让它在设计时和运行时都能正常工作。这个解决方案对我有用,相当简单,从我的研究中可以看出最佳实践。