web-dev-qa-db-ja.com

WPF画像リソース

私は主にWebと少しWindowsフォームの背景から来ています。新しいプロジェクトでは、WPFを使用します。説明のために、WPFアプリケーションには10個から20個の小さなアイコンと画像が必要です。これらをアセンブリに埋め込みリソースとして格納することを考えています。それは正しいやり方ですか?

XAMLでImageコントロールが埋め込みリソースからイメージを読み込むように指定する方法

382
driis

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

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

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

それでは、あなたのコードで、次のようなものを使用します。

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

私の場合は、ResourceではなくContentのビルドアクションを持つようにImage.pngファイルを設定する必要があることがわかりました。これにより、イメージはコンパイル済みのアセンブリ内で運ばれます。

452
Drew Noakes

私は画像、ビデオなどを使用することのベストプラクティスであることがわかりました:

  • ファイルを変更してください "Build action" から "Content" に変更してください。 ビルドディレクトリにコピーする を必ず確認してください。
    • ソリューションエクスプローラウィンドウの[右クリック]メニューにあります。
  • イメージソース 以下の形式で:
    • "/ «YourAssemblyName» ; component /«YourPath»/ «YourImage.png» "

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

利点:

  • ファイルはアセンブリに埋め込まれていません。
    • リソースマネージャは、(ビルド時に)リソースが多すぎるとメモリオーバーフローの問題をいくつか発生させます。
  • アセンブリ間で呼び出すことができます。
161
Nuno Rodrigues

何人かの人々はコードでこれをすることについて尋ねていて、答えを得ない。

何時間もかけて検索したところ、非常に単純な方法が見つかりましたが、例は見つかりませんでした。そのため、ここではイメージを処理する作業を共有します。 (私のものは.gifでした)

概要:

ImageSourceの "destination"が気に入っているように見える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);
}

学び

私の経験から、パック文字列は問題ではありません、あなたのストリームをチェックしてください、そして特にそれを最初に読んだ場合はファイルの終わりにポインタを設定しています。

私はこの作品が私のためにあったことを望む私はこれがあなたに多くの時間を節約することを願っています!

44
Craig

私のイメージ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パックのURI
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

39
Eric Ouellet

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

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

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

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

36
ema

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

そしてそれらをどのように参照するかについては、「WPFでのURIのパック」を読んでください。

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

13
techfan
  1. Visual Studio 2010 Professional SP1。
  2. .NET Framework 4クライアントプロファイル。
  3. PNG画像がプロジェクトプロパティのリソースとして追加されました。
  4. Resourcesフォルダに新しいファイルが自動的に作成されます。
  5. リソースに設定されたアクションを構築します。

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

<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
4
JoanComasFdz

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

<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>
3
Sanjay Ranavaya

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

3
user42467