3

我读过很多例子。我所拥有的似乎是正确的。但是在加载时它失败了。

这是我的代码:

LargeImage=new BitmapImage(new Uri("pack://application:,,,/Images/books_48.png"))

此代码在 AssemblyA 中运行。AssemblyA 的项目中还有一个名为 Images 的文件夹。该文件夹有一个名为 books_48.png 的文件。它设置为编译为“资源”并且从不复制。

我使用 DotPeek 查看图像是否在 AssemblyA.dll 中并且它在那里。

第一个引用LargeImage是在 AssemblyB 中。它将 LargeImage 绑定到 FluentRibbon Fluent:Button.LargeIcon。

当需要加载 BitmapImage 时,我收到此错误:

找不到资源“images/books_48.png”。

关于如何加载它的任何想法?

注意:我也试过这些:

"pack://application:,,,/AssemblyA;component/Images/books_48.png"
"pack://application:,,,/AssemblyA;Images/books_48.png"
"pack://application:,,,/AssemblyA;/Images/books_48.png"
"pack://application:,,,/Images/books_48.png"
"pack://application:,,,Images/books_48.png"
"Images/books_48.png"
"/Images/books_48.png"

他们都给我错误(“找不到”或“无效的 URI”类型的错误)。

4

2 回答 2

0

我使用我的 ImageUtilities 类在 C# 中获取图像。我将附上下面的代码..

我总是将我的图像设置为“资源”“不要复制”。然后我总是将所有图像复制到我的 Properties\Resources.resx 文件中。这可以通过扩展作为项目文件夹中第一项的“属性”文件夹在 Visual Studio 中完成。然后双击“Resources.resx”文件,就会弹出设计器。在此窗口的左上角,单击下拉菜单并选择“图像”。然后突出显示项目中的所有图像文件(来自解决方案资源管理器)并将它们复制/粘贴到 Resources.resx 的窗口中。

这样,在后面的代码中,我可以通过键入以下内容来访问它们:

属性.资源.图像名;

这给了你一个位图。

我使用我的 ImageUtilities 类将其转换为 ImageSource 以用于 WPF。因此,如果我有一个名为“MyPicture.png”的图像,我会在 ImageUtilities 类上进行以下调用:

ImageSource source = ImageUtilities.ImageSourceFromResourceKey(
                                  Properties.Resources.MyPicture, "MyPicture");

我传递文本“MyPicture”的原因是我可以缓存图像,而不必为每张图像创建一次以上。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace Helpers
{
    public static class ImageUtilities
    {
        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);
        public static Dictionary<String, ImageSource> _cachedImages = new Dictionary<string, ImageSource>();

        public static ImageSource ImageSourceFromBitmap(Bitmap bitmap)
        {
            if (bitmap == null)
            {
                return ImageSourceFromResourceKey(Properties.Resources.Exit, "Exit");
            }

            try
            {
                IntPtr hBitmap = bitmap.GetHbitmap();
                BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                    hBitmap,
                    IntPtr.Zero,
                    Int32Rect.Empty,
                    BitmapSizeOptions.FromEmptyOptions());

                DeleteObject(hBitmap);
                return bitmapSource;
            }
            catch (Exception ex)
            {
                //Error loading image.. Just log it...
                Helpers.Debug(ex.ToString());
            }

            return null;
        }

        public static ImageSource ImageSourceFromResourceKey(Bitmap bitmap, string imageKey)
        {
            if (!_cachedImages.ContainsKey(imageKey))
            {
                _cachedImages[imageKey] = ImageSourceFromBitmap(bitmap);
            }

            return _cachedImages[imageKey];
        }
    }
}
于 2012-06-15T21:12:55.147 回答
-2

请参阅 Nuno Rodriguez 对WPF 图像资源的回答。它解释了路径应该是:

"/«Assembly A»;组件/«YourPath»/«YourImage.png»"

于 2012-06-15T21:01:43.460 回答