Включить перетаскивание в приложении winform - PullRequest
0 голосов
/ 06 апреля 2020

Я хотел бы включить функцию перетаскивания для моего приложения winforms. Основная форма пользовательского интерфейса - это контейнер MDI.

Я добавил следующий код в основную форму

    mainuiform.AllowDrop = true;
    mainuiform.DragDrop += OnDragDrop;
    mainuiform.DragEnter += OnDragEnter;

Перетаскивание не работает в теле приложения и работает только в заголовке приложения.

Затем я прочитал, что перетаскивание должно быть включено для каждого дочернего компонента, тогда только мы можем отбросить документ в любом месте пользовательского интерфейса приложения. Это больно, поскольку различные формы в MDI создаются разными командами.

Как мне этого добиться?

1 Ответ

0 голосов
/ 06 апреля 2020
  1. Добавление обработчика событий в основную форму (конструктор)
  2. Добавление обработчика событий ко всем дочерним компонентам главной формы (в событии загрузки)
  3. Добавление обработчика событий в дочерний объект mdi и все его дочерние компоненты (событие MdiChildActivate)

, так как я использую Dev Express, существует несколько методов Dev Express (должен быть эквивалентен winforms).

        public MainMdiForm() {
            RegisterDragDropEvents(this);
            MdiChildActivate += OnMdiChildActivate;
        }

        // load event handler
        private void MainMdiFormLoad(object sender, EventArgs e)
            if(sender is XtraForm form)
                form.ForEachChildControl(RegisterDragDropEvents);
        }

        private void RegisterDragDropEvents(Control control)
        {
            control.AllowDrop = true;
            control.DragDrop += OnDragDrop;
            control.DragEnter += OnDragEnter;
        }

        private void DeRegisterDragDropEvents(Control control)
        {
            control.DragDrop -= OnDragDrop;
            control.DragEnter -= OnDragEnter;
        }

        private void OnMdiChildActivate(object sender, EventArgs e)
        {
            if (sender is XtraForm form)
            {
                // since the same event is called on activate and de active, have observed that ActiveControl == null on de active
                // using the same to de register
                if (form.ActiveControl == null)
                {
                    form.ForEachChildControl(DeRegisterDragDropEvents);
                }
                else
                {
                    form.ForEachChildControl(RegisterDragDropEvents);
                }
            }
        }

        void OnDragDrop(object sender, DragEventArgs e)
        {
          // take action here
        }

        void OnDragEnter(object sender, DragEventArgs e)
        {
            // additional check and enable only when the file is of the expected type
            e.Effect = DragDropEffects.All;
        }

Перетаскивание работает в приложении с этим кодом.

...