在我的C#项目中,我有一个图像列表,这些图像是在exe中编译的资源:
/Pics/Image1.png /Pics/Image2.png /Pics/Image3.png …
在我的代码中,我处理图像以使它们与主题相匹配……
花了几天时间,但我想出了一个解决方案!
我将所有图像移动到同一解决方案中的另一个C#项目中,设置为编译为名为DynamicResources.dll的类库DLL文件(项目设置中的程序集名称为“DynamicResources”)。该项目作为主项目的参考添加。因此,我可以访问XAML中的图像 - 干净整洁:
<Image Source="/DynamicResources;component/pics/image1.png" />
然后在主项目的后期构建事件中, 的 我重命名已编译的.dll,以便在启动时不会被主.exe二进制文件加载 强> :
copy "$(TargetDir)DynamicResources.dll" "$(TargetDir)DynamicResources.temp" del "$(TargetDir)DynamicResources.dll"
然后我使用名为Mono.Cecil的第三方库来加载DynamicResources.temp文件(DLL格式),替换资源,将其写回内存,然后告诉应用程序加载它:
public static void UpdateAssembly() { string dllFile = "DynamicResources.temp"; string dllNamespace = "DynamicResources"; var asm = AssemblyDefinition.ReadAssembly(dllFile); var module = asm.Modules.FirstOrDefault(); var resources = module.Resources; var dllResource = (EmbeddedResource)(resources.FirstOrDefault()); var dllResourceReader = new ResourceReader(dllResource.GetResourceStream()); var newResourceOutputStream = new MemoryStream(); var newResourceWriter = new ResourceWriter(newResourceOutputStream); foreach (DictionaryEntry dllResourceEntry in dllResourceReader) { var image = (BitmapSource)new ImageSourceConverter().ConvertFrom(dllResourceEntry.Value); Color foreground = (Color)ColorConverter.ConvertFromString("#FFFFFF"); var processed = (WriteableBitmap)ColorizeImage(image, foreground); // Your image processing function ? newResourceWriter.AddResource(dllResourceEntry.Key.ToString(), BitmapToByte(processed)); } newResourceWriter.Close(); var newResource = new EmbeddedResource(dllResource.Name, dllResource.Attributes, newResourceOutputStream.ToArray()); module.Resources.Remove(dllResource); module.Resources.Add(newResource); var woutput = new MemoryStream(); asm.Write(woutput); var doutput = woutput.ToArray(); Assembly assembly = Assembly.Load(doutput); } public static MemoryStream BitmapToByte(BitmapSource bitmapSource) { var encoder = new System.Windows.Media.Imaging.PngBitmapEncoder(); var frame = System.Windows.Media.Imaging.BitmapFrame.Create(bitmapSource); encoder.Frames.Add(frame); var stream = new MemoryStream(); encoder.Save(stream); return stream; } public static void AttachAssembly(string myAsmFileName) { Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + myAsmFileName); // LoadFrom AppDomain.CurrentDomain.Load(assembly.GetName()); }
的 重要说明:在迭代资源时,它们变为小写,因此您必须使用小写文件和文件夹名称。 强>
你试过创建一个 Bitmap 然后将其设置为图像 source ?我认为这应该很容易。比如说,给你的形象起个名字 theImage 。如果没有给它起一个名字,你就不可能引用它。 请尝试以下方法:
Bitmap
source
theImage
string path="/Pics/Image3.png";//path to the image var bitmapImage=new Bitmap(new Uri(path)); theImage.source=bitmapImage;//set the bitmap as the source.
还有其他方法可以实现这一点。希望这可以帮助?