Skip to main content

ImageLoader.CustomGetImageInfo Event

Occurs before image metadata is loaded.

Namespace: DevExpress.ExpressApp.Utils

Assembly: DevExpress.ExpressApp.v25.2.dll

NuGet Package: DevExpress.ExpressApp

Declaration

public static event EventHandler<CustomGetImageInfoEventArgs> CustomGetImageInfo

Event Data

The CustomGetImageInfo event's data class is DevExpress.ExpressApp.Utils.CustomGetImageInfoEventArgs.

Remarks

Handle the CustomGetImageInfo event to supply an ImageInfo object for a requested image. Use the ImageName value to identify the image to load. The following example loads images from a database.

  • Implement the following MyImageObject business class:

    using DevExpress.Persistent.Base;
    using DevExpress.Persistent.BaseImpl.EF;
    // ...
    [DefaultClassOptions]
    public class MyImageObject : BaseObject {
        public virtual string Name { get; set; }
        [ImageEditorAttribute(ImageEditorMode.PictureEdit, ImageEditorMode.PictureEdit, 
            DetailViewImageEditorFixedHeight = 32, DetailViewImageEditorFixedWidth = 32)]
        [VisibleInListView(true)]
        public virtual byte[] Image { get; set; }
    }
    
    // Make sure that you use options.UseChangeTrackingProxies() in your DbContext settings.
    
  • Create predefined **MyImageObject instances in the overridden ModuleUpdater.UpdateDatabaseAfterUpdateSchema method.

    public override void UpdateDatabaseAfterUpdateSchema() {
        base.UpdateDatabaseAfterUpdateSchema();
        MyImageObject image1 = ObjectSpace.CreateObject<MyImageObject>();
        image1.Name = "Image 1";
        var stream = new System.IO.MemoryStream();
        ImageLoader.Instance.GetSmallImageInfo("Action_Save").Image.Save(stream, ImageFormat.Png);
        image1.Image = stream.ToArray();
    
        MyImageObject image2 = ObjectSpace.CreateObject<MyImageObject>();
        image2.Name = "Image 2";
        stream = new System.IO.MemoryStream();
        ImageLoader.Instance.GetSmallImageInfo("Action_Delete").Image.Save(stream, ImageFormat.Png);
        image2.Image = stream.ToArray();
        ObjectSpace.CommitChanges();
     }
    
  • Edit the Program.cs file and handle the static CustomGetImageInfo event before the XafApplication.Setup method is called.

    using System.IO;
    using System.Drawing;
    using System.Drawing.Imaging;
    // ...
    ImageLoader.CustomGetImageInfo += (sender, e) => {
        if(e.ImageName.StartsWith(MyWindowController.MyImagePrefix)) {
            int key;
            string key_string = e.ImageName.Split('_')[1];
            if(int.TryParse(key_string, out key)) {
                using(IObjectSpace objectSpace = winApplication.CreateObjectSpace(typeof(MyImageObject))) {
                    MyImageObject imageObject = objectSpace.GetObjectByKey<MyImageObject>(key);
                    if(imageObject != null) {
                        e.ImageInfo = new ImageInfo(e.ImageName, Image.FromStream(new MemoryStream(imageObject.Image)), null);
                        e.Handled = true;
                    }
                }
            }
        }
    };
    
  • Now, you can specify images as follows:

    using DevExpress.ExpressApp;
    using DevExpress.ExpressApp.Actions;
    // ...
    public class MyWindowController : WindowController {
        public const string MyImagePrefix = "MyImageObject_";
        SingleChoiceAction action;
        public MyWindowController() : base() {
            this.TargetWindowType = WindowType.Main;
            action = new SingleChoiceAction(this, "My Action", DevExpress.Persistent.Base.PredefinedCategory.Edit);
            action.ImageMode = ImageMode.UseItemImage;
            action.ItemType = SingleChoiceActionItemType.ItemIsOperation;
        }
        protected override void OnActivated() {
            base.OnActivated();
            action.Items.Clear();
            using(IObjectSpace objectSpace = Application.CreateObjectSpace(typeof(MyImageObject))) {
                foreach(MyImageObject imageObject in objectSpace.GetObjects<MyImageObject>()) {
                    ChoiceActionItem item = new ChoiceActionItem();
                    item.Caption = imageObject.Name;
                    item.ImageName = MyImagePrefix + imageObject.ID;
                    action.Items.Add(item);
                }
            }
        }
    }
    
See Also