2

我在自定义控件上有一个按钮,我试图在其上显示一个图像,该图像在我的 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/ 中。所以我在设计时收到警告,但它在运行时工作正常。

那么为什么它在 App.xaml 中定义时找不到我的资源?我在常规 WPF 项目中以完全相同的方式执行此操作,并且它完美地工作,但在这个自定义控件库中,它让我很头疼。任何帮助深表感谢!

4

2 回答 2

2

如果您切换StaticResource到,这应该可以工作,DynamicResource以便在运行时动态而不是静态地评估资源。如果切换到DynamicResource.

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

我相信这是因为如何处理基于主题的样式和模板,而不是标准资源。 这个答案这个答案专门针对 Generic.xaml 以及它与其他 .xaml 的不同之处ResourceDictionaries

于 2013-02-28T18:46:39.583 回答
1

所以我最终让它工作的方式是在 Generic.xaml 文件中定义 BitmapImage 并使用 Pack URI 来获取文件(这是关于 Pack URIs 的 MSDN 文章,坦率地说,这让我感到困惑)。这样,它使用文件的相对路径,并指定它来自的程序集(文件位于 MyCustomControlLibrary 项目中的 \Resources\PlusSymbol.png 并具有资源的构建操作):

<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 中执行此操作,我只是想让它在设计时和运行时都能正常工作。这个解决方案对我有用,相当简单,从我的研究中可以看出是最佳实践。

于 2013-03-04T19:09:07.013 回答