説明目的で 10 ~ 20 個の小さなアイコンと画像を必要とする WPF アプリケーションの場合、これらをアセンブリに埋め込みリソースとして保存するのは正しい方法ですか?
その場合、画像コントロールが埋め込みリソースから画像を読み込む必要があることを XAML で指定するにはどうすればよいですか?
説明目的で 10 ~ 20 個の小さなアイコンと画像を必要とする WPF アプリケーションの場合、これらをアセンブリに埋め込みリソースとして保存するのは正しい方法ですか?
その場合、画像コントロールが埋め込みリソースから画像を読み込む必要があることを XAML で指定するにはどうすればよいですか?
画像を複数の場所で使用する場合は、画像データを一度だけメモリにロードしてから、すべてのImage
要素間で共有することをお勧めします。
これを行うには、BitmapSource
どこかにリソースとして を作成します。
<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />
次に、コードで次のようなものを使用します。
<Image Source="{StaticResource MyImageSource}" />
私の場合、Image.png
ファイルを設定して、ビルドアクションResource
だけでなくContent
. これにより、コンパイルされたアセンブリ内でイメージが実行されます。
画像、動画などを使用するベスト プラクティスは次のとおりです。
<Image Source="/WPFApplication;component/Images/Start.png" />
利点:
一部の人々は、コードでこれを行うことについて質問していて、答えを得ていません。
何時間も検索した後、非常に簡単な方法を見つけましたが、例が見つからなかったので、ここで画像を処理する私のものを共有します。(私のものは.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);
}
学習:
私の経験から、パック文字列は問題ではありません。ストリームを確認してください。特に、初めて読み取るときにファイルの末尾にポインタが設定されている場合は、再度読み取る前にゼロに再設定する必要があります。
これにより、この作品が私のために持っていればよかった多くの時間を節約できることを願っています!
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
はい、それは正しい方法です。
パスを使用するだけで、リソース ファイル内の画像を使用できます。
<Image Source="..\Media\Image.png" />
イメージ ファイルのビルド アクションを「リソース」に設定する必要があります。
リソースの使用方法の完全な説明: WPF アプリケーション リソース、コンテンツ、およびデータ ファイル
また、それらを参照する方法については、「Pack URIs in WPF」を参照してください。
つまり、参照/参照アセンブリからリソースを参照する手段さえあります。
これは私のために働いた:
<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
Blendを使用している場合、 Source属性の正しいパスを取得する際に問題が発生しないように、プロジェクト パネルからデザイナーに画像をドラッグ アンド ドロップするだけです。
はい、正しい方法です。パスを使用して、リソース ファイルで画像を使用できます。
<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>
以下が機能し、設定する画像はプロパティのリソースです。
var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;