私は主にWebと少しWindowsフォームの背景から来ています。新しいプロジェクトでは、WPFを使用します。説明のために、WPFアプリケーションには10個から20個の小さなアイコンと画像が必要です。これらをアセンブリに埋め込みリソースとして格納することを考えています。それは正しいやり方ですか?
XAMLでImageコントロールが埋め込みリソースからイメージを読み込むように指定する方法
画像を複数の場所で使用する場合は、画像データをメモリに1回だけロードしてから、すべてのImage
要素で共有することをお勧めします。
これを行うには、リソースとして BitmapSource
をどこかに作成します。
<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />
それでは、あなたのコードで、次のようなものを使用します。
<Image Source="{StaticResource MyImageSource}" />
私の場合は、Resource
ではなくContent
のビルドアクションを持つようにImage.png
ファイルを設定する必要があることがわかりました。これにより、イメージはコンパイル済みのアセンブリ内で運ばれます。
私は画像、ビデオなどを使用することのベストプラクティスであることがわかりました:
<Image Source="/WPFApplication;component/Images/Start.png" />
利点:
何人かの人々はコードでこれをすることについて尋ねていて、答えを得ない。
何時間もかけて検索したところ、非常に単純な方法が見つかりましたが、例は見つかりませんでした。そのため、ここではイメージを処理する作業を共有します。 (私のものは.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);
}
学び
私の経験から、パック文字列は問題ではありません、あなたのストリームをチェックしてください、そして特にそれを最初に読んだ場合はファイルの終わりにポインタを設定しています。
私はこの作品が私のためにあったことを望む私はこれがあなたに多くの時間を節約することを願っています!
私のイメージ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
はい、それは正しい方法です。
パスを使用するだけで、リソースファイル内の画像を使用できます。
<Image Source="..\Media\Image.png" />
イメージファイルのビルドアクションを "Resource"に設定する必要があります。
リソースの使い方の詳細な説明:WPFアプリケーションのリソース、コンテンツ、およびデータファイル
そしてそれらをどのように参照するかについては、「WPFでのURIのパック」を読んでください。
つまり、参照/参照アセンブリからリソースを参照する手段さえあります。
これは私のために働いた:
<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
はい、それは正しい方法です。パスを使用してリソースファイル内の画像を使用できます。
<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>
Blend を使用している場合は、それをさらに簡単にし、 Source 属性の正しいパスを取得するのに問題がない場合は、プロジェクトパネルからデザイナーに画像をドラッグアンドドロップするだけです。