回答:
画像を複数の場所で使用する場合は、画像データをメモリに1回だけロードし、すべてのImage
要素間で共有する価値があります。
これを行うには、BitmapSource
どこかにリソースとしてを作成します。
<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />
次に、コードで次のようなものを使用します。
<Image Source="{StaticResource MyImageSource}" />
私の場合、Image.png
ファイルをResource
だけではなくのビルドアクションを持つように設定する必要があることがわかりましたContent
。これにより、コンパイルされたアセンブリ内でイメージが実行されます。
DynamicResource
ではなくマークアップ拡張を使用する必要がある場合がありStaticResource
ます。WPFでは、実行時にリソースディクショナリを作成できます。実際、これはXamlドキュメントをロードしたときに発生することであり、同等のC#が表示されないだけです。
Width="{Binding Source.PixelWidth, RelativeSource={RelativeSource Self}}"
しImage
ます。そうしないと、何らかの理由で画像がグロテスクに拡大されることがよくあります(たとえば、16x16のアイコンが200x200ピクセルのように引き伸ばされているなど)。
画像、動画などを使用するベストプラクティスであることがわかりました。
<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
new Uri(@"pack://application:,,,/" + pathInApplication)
もトリックをしました。
はい、それは正しい方法です。
パスを使用するだけで、リソースファイル内の画像を使用できます。
<Image Source="..\Media\Image.png" />
イメージファイルのビルドアクションを「リソース」に設定する必要があります。
リソースの使用方法の詳細:WPFアプリケーションリソース、コンテンツ、およびデータファイル
また、それらを参照する方法については、「URIをWPFにパックする」を参照してください。
つまり、参照された/参照しているアセンブリからリソースを参照する手段さえあります。
これは私のために働きました:
<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>
以下は機能し、設定される画像はプロパティのリソースです:
var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;