【问题标题】:Using app-level resources in the Generic.xaml file of a custom control library在自定义控件库的 Generic.xaml 文件中使用应用级资源
【发布时间】:2013-03-05 03:17:37
【问题描述】:

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

【问题讨论】:

    标签: wpf wpf-controls


    【解决方案1】:

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

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

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

    【讨论】:

    • 我试过了,我不再遇到崩溃但按钮上没有显示图像。
    • 如果是这种情况,那么听起来 WPF 找不到图像。确保图像上的 BuildAction 设置为 Resource 或 EmbeddedResource(不是 Content)。如果您将Image 添加到应用程序的不同屏幕(不涉及generic.xaml),它会显示在那里吗?
    • 好吧,在我的主 UI 项目中,我可以使用在该主 UI 项目的 App.xaml 中指定的图像,但我现在尝试做基本相同的事情,但在自定义控件库中.据我所知,我的自定义控件库中的 Generic.xaml 文件似乎看不到自定义控件库的 App.xaml 文件中定义的资源。
    【解决方案2】:

    所以我最终得到这个工作的方式是在 Generic.xaml 文件中定义 BitmapImage 并使用 Pack URI 来访问该文件(here's the MSDN article about Pack URIs,坦率地说这让我很困惑)。这样,它使用文件的相对路径,并指定它来自的程序集(文件位于 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 中执行此操作,我只是想让它在设计时和运行时都能正常工作。这个解决方案对我有用,相当简单,从我的研究中可以看出是最佳实践。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2016-08-09
      • 1970-01-01
      • 2011-03-28
      • 2023-04-06
      • 1970-01-01
      相关资源
      最近更新 更多