[c#] WPF圖像資源



Answers

我發現使用圖像,視頻等最佳做法是:

  • 將您的文件“構建操作”更改為“內容” 。 一定要選中Copy to build directory
    • 在“解決方案資源管理器”窗口的“右鍵單擊”菜單中找到
  • 圖像來源格式如下:
    • “/ «YourAssemblyName» ;組件/«YourPath»/«YourImage.png»

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

優點:

  • 文件沒有嵌入到程序集中
    • 資源管理器會通過太多的資源(在構建時)提出一些內存溢​​出問題,
  • 可以在程序集之間調用
Question

我主要來自網頁和一些Windows窗體背景。 對於一個新項目,我們將使用WPF。 出於說明目的,WPF應用程序需要10-20個小圖標和圖像。 我正在考慮將這些作為嵌入式資源存儲在程序集中。 這是正確的路嗎?

如何在XAML中指定Image控件應該從嵌入資源加載圖像?




如果您使用的是融合,為了讓它變得更加簡單,並且在獲取Source屬性的正確路徑時沒有任何問題,只需將圖像從“項目”面板拖放到設計器上即可。




在代碼中,在我的圖片Freq.png所在的executiong程序Freq.png加載資源,並將其定義為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




這工作

並且要設置的圖像是屬性中的資源

    var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
                                      IntPtr.Zero,
                                      Int32Rect.Empty,
                                      BitmapSizeOptions.FromEmptyOptions());
    MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;








Related