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

Wpf 使用自定义控件库的Generic.xaml文件中的应用程序级资源,wpf,wpf-controls,Wpf,Wpf Controls,我在自定义控件上有一个按钮,我试图在上面显示一个图像,该图像在我的App.xaml文件中定义为一个资源,如下所示: <Application.Resources> <BitmapImage x:Key="PlusSymbol" UriSource="Resources/PlusSymbol.png" /> </Application.Resources> <Button Grid.Row="0" Grid.Column="1" Margin="

我在自定义控件上有一个按钮,我试图在上面显示一个图像,该图像在我的App.xaml文件中定义为一个资源,如下所示:

<Application.Resources>
    <BitmapImage x:Key="PlusSymbol" UriSource="Resources/PlusSymbol.png" />
</Application.Resources>
<Button Grid.Row="0" Grid.Column="1" Margin="3" Height="25" Width="25" 
      <Image Source="{StaticResource PlusSymbol}"/>
</Button>

由于某些原因,我无法将其用作在Themes\Generic.xaml文件中定义的自定义控件模板中的静态资源,它会在运行时使我的应用程序崩溃,说明它找不到请求的资源。下面是我用来绑定到资源的xaml代码:

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

如果我以完全相同的方式在Generic.xaml文件中定义资源,那么它在运行时确实有效,但是它会给我一个预编译器警告,它找不到该文件,因为它现在在Themes/Resources/中查找它,而不仅仅是在/Resources/中。所以我在设计时收到一个警告,但在运行时效果很好


那么,为什么它在App.xaml中定义时找不到我的资源呢?我在一个常规的WPF项目中使用完全相同的方法来实现这一点,它工作得非常完美,但在这个自定义控件库中,它让我头疼。非常感谢您的帮助

如果您将
StaticResource
切换到
DynamicResource
,这样资源将在运行时动态评估,而不是静态评估,那么这应该是可行的。如果切换到
DynamicResource

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


我相信这是因为与标准资源相反,基于主题的样式和模板是如何处理的。特别是Generic.xaml,以及它与其他
资源字典的不同之处。因此,我最终实现这一点的方法是在Generic.xaml文件中定义位图图像,并使用包URI访问该文件(坦率地说,这让我感到困惑)。通过这种方式,它使用文件的相对路径,并指定它来自的程序集(该文件位于MyCustomControlLibrary项目中的\Resources\PlusSymbol.png,并具有Resource的生成操作):


然后在Generic.xaml中的控件模板中,我使用如下资源:

<Application.Resources>
    <BitmapImage x:Key="PlusSymbol" UriSource="Resources/PlusSymbol.png" />
</Application.Resources>
<Button Grid.Row="0" Grid.Column="1" Margin="3" Height="25" Width="25" 
      <Image Source="{StaticResource PlusSymbol}"/>
</Button>

我尝试了这个,我不再得到崩溃,但是图像没有显示在按钮上。如果是这样的话,那么听起来好像WPF找不到图像。确保图像上的
BuildAction
设置为Resource或EmbeddedResource(非Content)。如果将
图像
添加到应用程序中的其他屏幕(不涉及generic.xaml),它会显示在那里吗?在我的主UI项目中,我可以使用在该主UI项目的app.xaml中指定的图像,但我现在正尝试做基本相同的事情,只是在自定义控件库中。据我所知,自定义控件库中的Generic.xaml文件似乎看不到自定义控件库的App.xaml文件中定义的资源。