четверг, 16 октября 2014 г.

Извлечение иконок из сборки библиотки DevExpress

[DevExpress Image Gallery File Extractor]

Библиотка элементов управления DevExpress для WinForms содержит сборку “DevExpress.Images”, иконки которой отобржаются в галерее картинок (DX Image Gallery). Эта иконки доступны в диалоге выбора картинок из ресурсов для контролов этой библиотки.

Ниже код для извлечения этих ресурсов в файловую систему.

private void buttonExtractImages_Click(object sender, EventArgs e) {
    String extractFodlerPath = null;

    FolderBrowserDialog fbd = new FolderBrowserDialog();
    if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        extractFodlerPath = fbd.SelectedPath;
    else
        return; 

    try {
        Assembly assembly = typeof(DevExpress.Images.DXImages).Assembly;
        foreach (String name in assembly.GetManifestResourceNames()) {
            using (Stream stream = assembly.GetManifestResourceStream(name)) {

                using (IResourceReader reader = new ResourceReader(stream)) {
                    foreach (DictionaryEntry entry in reader) {

                        String fileName = entry.Key.ToString().Replace("/", "_");

                        byte[] bytes = null;
                        using (UnmanagedMemoryStream ums = entry.Value as UnmanagedMemoryStream) {
                            bytes = new byte[ums.Length];
                            ums.Read(bytes, 0, bytes.Length);
                        }

                        FileInfo fi = new FileInfo(Path.Combine(extractFodlerPath, fileName));
                        using (FileStream fs = fi.OpenWrite()) {
                            fs.Write(bytes, 0, bytes.Length);
                        }
                    }
                }
            }
        }
    }
    catch (Exception ex) {
        MessageBox.Show(ex.Message, "Error");
    }
}

Результат выглядит следующим образом:


понедельник, 13 октября 2014 г.

Автоматическое изменение размеров пользовательского элемента управления, базирующегося на TokenEdit из библиотеки DevExpress (WinForms)

[Autosize of UserControl based on TokenEdit (DevExpress, WinForms)]

Еще один простой пример реализации пользовательского контрола, когда понадобилась поддержка его автоматического вертикального изменения в элементе управления LayoutControl. Для этого элемент управления должен нужным образом реализовывать интерфейс IXtraResizableControl.

Как это выглядит в деле:



Элемент управления простой, состоит из двух элементов - собственно TokenEdit и SimpleButton (в моем случае предусмотрен для редактирования списка элементов токена). Для TokenEdit свойство Anchor имеет значения "Top, Left, Right" и для SimpleButton значения "Left, Right".



Код реализации:

using DevExpress.Utils.Controls;
using DevExpress.XtraEditors;
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    public partial class UserControl1 : UserControl , IXtraResizableControl
    {
        public UserControl1() {
            InitializeComponent();

            this.Height = GetMaxHeight();
            this.tokenEdit1.Resize += tokenEdit1_Resize;
        }

        public TokenEdit TokenCtrl { get { return tokenEdit1; } }

        private int GetMaxHeight() {
            // выбираем наибольшее значение высоты из двух доступных элементов: TokenEdit или SimpleButton
            return simpleButton1.Height > tokenEdit1.Height ? simpleButton1.Height : tokenEdit1.Height;
        }

        int height = 0;
        void tokenEdit1_Resize(object sender, EventArgs e) {
            if (height != GetMaxHeight()) {
                height = GetMaxHeight();
                if (ChangedCore != null) ChangedCore(this, EventArgs.Empty);
            }
        }

        event EventHandler ChangedCore;
        event EventHandler IXtraResizableControl.Changed {
            add { ChangedCore += value; }
            remove { ChangedCore -= value; }
        }

        public bool IsCaptionVisible {
            get { return false; }
        }

        public Size MaxSize {
            get { return new Size(0, GetMaxHeight()); }
        }

        public Size MinSize {
            get { return new Size(0, GetMaxHeight()); }
        }
    }
}

Ну и на последок, инициализация элемента данными для теста:

using DevExpress.XtraEditors;
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            for (int i = 1; i < 10; i++) {

                TestObject obj1 = new TestObject();
                obj1.ID = i.ToString();
                obj1.Value = "Value " + i;

                userControl11.TokenCtrl.Properties.Tokens.Add(new TokenEditToken(obj1));
            }
        }

        class TestObject
        {
            public String ID { get; set; }
            public String Value { get; set; }

            public override string ToString() {
                return Value;
            }
        }
    }
}