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 のウィンドウにコピーして貼り付けます。

このようにして、コード ビハインドで次のように入力してアクセスできます。

Properties.Resources.ImageName;

これにより、ビットマップが得られます。

ImageUtilities クラスを使用して、WPF で使用する ImageSource に変換します。したがって、'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

WPF画像リソースに対するNunoRodriguezの回答を参照してください。パスは次のようになっている必要があることを説明しています。

"/«アセンブリA»;component/«YourPath»/«YourImage.png»"

于 2012-06-15T21:01:43.460 に答える