Показаны сообщения с ярлыком DevExpress. Показать все сообщения
Показаны сообщения с ярлыком DevExpress. Показать все сообщения

четверг, 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;
            }
        }
    }
}

понедельник, 24 сентября 2012 г.

Автоматическое изменение размеров FlowLayoutPanel в XtraLayoutControl (DevExpress)


[FlowLayoutPanel with autosize in XtraLayoutControl]

Работая с библиотекой элементов управления для WinForms от DevExpress в ходе практики накопилась небольшая тележка различных решений, обходных путей и просто интересных подходов. Со временем планирую их здесь опубликовать. Ну а пока, покажу, как я реализовал автоматическое изменение размеров FlowLayoutPanel в XtraLayoutControl, так чтобы все элементы, помещенные в FlowLayoutPanel, были всегда видны.

На рисунках отображен уже конечный результат, которого я хотел добиться:






XtraLayoutControl отлично управляет размерами и расположениями “своих” элементов управления из библиотеки DevExpress, но совершено не справляется со стандартными элементами управления, к которым относится FlowLayoutPanel. Дело в том, что XtraLayoutControl взаимодействует с элементами своеобразным образом и требует от элементов реализации специфичных интерфейсов. В нашем случае достаточно использовать интерфейс IXtraResizableControl, который я реализовал в унаследованном от панели классе:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraLayout;
using System.Drawing;
using DevExpress.Utils.Controls;

namespace WindowsFormsApplication9
{
    public class MyFlowLayoutPanel : FlowLayoutPanel, IXtraResizableControl
    {
        public MyFlowLayoutPanel() { // ctor
            
        }

        LayoutControl rootLayoutControl = null;
        LayoutControlItem parentControlItem = null;

        protected override void OnHandleCreated(EventArgs e) {
            base.OnHandleCreated(e);

            if (System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime)
                return;

            LayoutControl parent = this.Parent as LayoutControl;
            if (parent != null) {

                this.rootLayoutControl = parent;
                this.parentControlItem = FindItemByContentControl(parent.Root, this);

                CalcAndUpdateSize();
                this.rootLayoutControl.Resize += (x, y) => { CalcAndUpdateSize(); };
                this.ControlAdded += (x, y) => { CalcAndUpdateSize(); };
                this.ControlRemoved += (x, y) => { CalcAndUpdateSize(); };
            }
        }

        void layoutControl_Changing(object sender, EventArgs e) {
            CalcAndUpdateSize();
        }

        // REM. http://www.devexpress.com/Support/Center/p/Q396747.aspx (Hot to find a conatner LayoutcontrolItem of a control)
        LayoutControlItem FindItemByContentControl(LayoutControlGroup layoutGroup, Control contentControl) {

            foreach (BaseLayoutItem baseLI in layoutGroup.Items) {
                LayoutControlItem lci = baseLI as LayoutControlItem;
                if (lci != null && lci.Control == contentControl)
                    return lci;

                LayoutControlGroup lcg = baseLI as LayoutControlGroup;
                if (lcg != null)
                    return FindItemByContentControl(lcg, contentControl);
            }
                
            return null;
        }


        private void CalcAndUpdateSize() {
            if (parentControlItem == null || parentControlItem.ViewInfo == null) return;

            this.MaximumSize = new Size(parentControlItem.ViewInfo.ClientArea.Width, 0);
            RaiseSizeChanged();
        }

        #region IXtraResizableControl Member

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

        protected void RaiseSizeChanged() {
            if (ChangedCore != null) ChangedCore(this, EventArgs.Empty);
        }

        bool IXtraResizableControl.IsCaptionVisible { get { return false; } }

        Size IXtraResizableControl.MaxSize { get { return new Size(0, this.PreferredSize.Height); } }

        Size IXtraResizableControl.MinSize { get { return new Size(0, this.PreferredSize.Height); } }

        #endregion
    }
}

Ссылки по теме:

IXtraResizableControl Interface:
http://documentation.devexpress.com/#WindowsForms/clsDevExpressUtilsControlsIXtraResizableControltopic
FlowLayoutPanel with autosize and layout control:
http://www.devexpress.com/Support/Center/p/Q292593.aspx

Вот собственно и все. Исходный код можете скачать здесь