439

説明目的で 10 ~ 20 個の小さなアイコンと画像を必要とする WPF アプリケーションの場合、これらをアセンブリに埋め込みリソースとして保存するのは正しい方法ですか?

その場合、画像コントロールが埋め込みリソースから画像を読み込む必要があることを XAML で指定するにはどうすればよいですか?

4

10 に答える 10

498

画像を複数の場所で使用する場合は、画像データを一度だけメモリにロードしてから、すべてのImage要素間で共有することをお勧めします。

これを行うには、BitmapSource どこかにリソースとして を作成します。

<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />

次に、コードで次のようなものを使用します。

<Image Source="{StaticResource MyImageSource}" />

私の場合、Image.pngファイルを設定して、ビルドアクションResourceだけでなくContent. これにより、コンパイルされたアセンブリ内でイメージが実行されます。

于 2009-03-03T16:02:33.630 に答える
195

画像、動画などを使用するベスト プラクティスは次のとおりです。

  • ファイルの"Build action""Content"に変更します。Copy to build directory を必ずチェックしてください。
    • ソリューション エクスプローラー ウィンドウの [右クリック] メニューにあります。
  • 次の形式の 画像ソース:
    • "/ «あなたのアセンブリ名» ;component/«あなたのパス»/ «あなたの画像.png» "

<Image Source="/WPFApplication;component/Images/Start.png" />

利点:

  • ファイルはアセンブリに埋め込まれません。
    • リソース マネージャーは、(ビルド時に) リソースが多すぎると、メモリ オーバーフローの問題を引き起こします。
  • アセンブリ間で呼び出すことができます。
于 2010-03-10T11:32:28.160 に答える
49

一部の人々は、コードでこれを行うことについて質問していて、答えを得ていません。

何時間も検索した後、非常に簡単な方法を見つけましたが、例が見つからなかったので、ここで画像を処理する私のものを共有します。(私のものは.gifでした)

概要:

これは、ImageSourceの「宛先」が好むように見えるBitmapFrameを返します。

使用する:

doGetImageSourceFromResource ("[YourAssemblyNameHere]", "[YourResourceNameHere]");

方法:

static internal ImageSource doGetImageSourceFromResource(string psAssemblyName, string psResourceName)
{
    Uri oUri = new Uri("pack://application:,,,/" +psAssemblyName +";component/" +psResourceName, UriKind.RelativeOrAbsolute);
    return BitmapFrame.Create(oUri);
}

学習:

私の経験から、パック文字列は問題ではありません。ストリームを確認してください。特に、初めて読み取るときにファイルの末尾にポインタが設定されている場合は、再度読み取る前にゼロに再設定する必要があります。

これにより、この作品が私のために持っていればよかった多くの時間を節約できることを願っています!

于 2011-02-13T16:49:45.760 に答える
47

Freq.png私のイメージがフォルダーIconsにあり、次のように定義されている実行中のアセンブリにリソースをロードするコードResource:

this.Icon = new BitmapImage(new Uri(@"pack://application:,,,/" 
    + Assembly.GetExecutingAssembly().GetName().Name 
    + ";component/" 
    + "Icons/Freq.png", UriKind.Absolute)); 

私も関数を作りました:

/// <summary>
/// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'.
/// </summary>
/// <param name="pathInApplication">Path without starting slash</param>
/// <param name="assembly">Usually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling assembly</param>
/// <returns></returns>
public static BitmapImage LoadBitmapFromResource(string pathInApplication, Assembly assembly = null)
{
    if (assembly == null)
    {
        assembly = Assembly.GetCallingAssembly();
    }

    if (pathInApplication[0] == '/')
    {
        pathInApplication = pathInApplication.Substring(1);
    }
    return new BitmapImage(new Uri(@"pack://application:,,,/" + assembly.GetName().Name + ";component/" + pathInApplication, UriKind.Absolute)); 
}

使用法 (関数を ResourceHelper クラスに入れると仮定):

this.Icon = ResourceHelper.LoadBitmapFromResource("Icons/Freq.png");

: WPF の MSDN Pack URI を参照してください。
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

于 2012-03-16T13:15:56.720 に答える
45

はい、それは正しい方法です。

パスを使用するだけで、リソース ファイル内の画像を使用できます。

<Image Source="..\Media\Image.png" />

イメージ ファイルのビルド アクションを「リソース」に設定する必要があります。

于 2008-12-07T17:34:29.843 に答える
14

リソースの使用方法の完全な説明: WPF アプリケーション リソース、コンテンツ、およびデータ ファイル

また、それらを参照する方法については、「Pack URIs in WPF」を参照してください。

つまり、参照/参照アセンブリからリソースを参照する手段さえあります。

于 2010-04-13T19:12:08.187 に答える
7
  1. Visual Studio 2010 プロフェッショナル SP1。
  2. .NET Framework 4 クライアント プロファイル。
  3. プロジェクト プロパティのリソースとして追加された PNG 画像。
  4. Resources フォルダーに新しいファイルが自動的に作成されます。
  5. リソースに設定されたビルド アクション。

これは私のために働いた:

<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
于 2011-08-23T09:16:51.013 に答える
3

Blendを使用している場合、 Source属性の正しいパスを取得する際に問題が発生しないように、プロジェクト パネルからデザイナーに画像をドラッグ アンド ドロップするだけです。

于 2008-12-07T23:52:15.977 に答える
3

はい、正しい方法です。パスを使用して、リソース ファイルで画像を使用できます。

<StackPanel Orientation="Horizontal">
    <CheckBox  Content="{Binding Nname}" IsChecked="{Binding IsChecked}"/>
    <Image Source="E:\SWorking\SharePointSecurityApps\SharePointSecurityApps\SharePointSecurityApps.WPF\Images\sitepermission.png"/>
    <TextBlock Text="{Binding Path=Title}"></TextBlock>
</StackPanel>
于 2018-04-24T10:47:37.907 に答える
-4

以下が機能し、設定する画像はプロパティのリソースです。

    var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
                                      IntPtr.Zero,
                                      Int32Rect.Empty,
                                      BitmapSizeOptions.FromEmptyOptions());
    MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;
于 2015-01-08T23:04:35.847 に答える