Событие BeginResize / EndResize для элемента управления в области разработки WinForms - PullRequest
2 голосов
/ 28 января 2020

TLDR: Я хотел бы знать, как я могу создать перехват в событии begin-resize и end-resize для экземпляра элемента управления во время разработки на поверхности конструктора.


Подробности: В частности, я работаю с поверхностью проектирования, созданной BasicLoader в пространствах имен System.Design и System.Component.Design. NET. В частности, я работаю во время разработки экземпляра TableLayoutPanel. Этот элемент управления выставляет событие SizeChanged и событие Resize - увы, оба запускаются во время операции изменения размера, то есть , в то время как изменение размера элемента управления, а также после завершения операции изменения размера. Поэтому я не знаю, когда началась операция изменения размера и когда она официально закончилась.

Один из способов решения этой проблемы - обнаружение события нажатия мыши и события изменения размера, но мне неясно, как я могу обнаружить событие нажатия мыши на любом из захватов. элемента управления, изменяемого размера.

Для записей я снова посетил BehaviorService и увидел, что он предоставляет BeginDrag , EndDrag и Synchronize - я ничего не вижу в этом сервис, который помог бы мне с событиями BeginResize / EndResize.

Итак, в идеале, я хотел бы подписаться на события BeginResize / EndResize для любого экземпляра конструктора элемента управления Winform, но я был бы рад, если бы предоставленный ответ покрывал только мою необходимость присоединения этих событий к конструктору экземпляр элемента управления TableLayoutPanel ...

Есть мысли?

1 Ответ

3 голосов
/ 28 января 2020

Когда начинается изменение размера, запускается транзакция конструктора с заданным описанием c, а когда дизайн заканчивается, транзакция будет закрыта.

Можно положиться на событие TransactionOpened в IDesignerHost и проверьте TransactionDescription, чтобы увидеть, начинается ли оно с "Resize", установите флаг resizing на true. Затем в TransactionClosed вы можете проверить, является ли флаг true, это означает, что произошел конец изменения размера.

Пример

Вот Po C, чтобы показать, как это работает. Добавьте следующий элемент управления в проект Windows Forms и после создания проекта поместите экземпляр MyControl в форму. Затем, если вы попытаетесь изменить размер формы, вы увидите текст Resize started. и Resize ended. в строке заголовка формы:

enter image description here

Вот код:

using System;
using System.ComponentModel.Design;
using System.Windows.Forms;
public class MyControl : Control
{
    IDesignerHost host;
    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
        if(DesignMode)
        {
            host = (IDesignerHost)Site.GetService(typeof(IDesignerHost));
            host.TransactionOpened += Host_TransactionOpened;
            host.TransactionClosed += Host_TransactionClosed;
        }
    }
    bool resizing = false;
    private void Host_TransactionOpened(object sender, EventArgs e)
    {
        if (host?.TransactionDescription?.StartsWith("Resize") == true)
        {
            resizing = true;
            ((Control)host.RootComponent).Text = "Resize Started.";
        }
    }
    private void Host_TransactionClosed(object sender,
        DesignerTransactionCloseEventArgs e)
    {
        if (resizing)
        {
            resizing = false;
            ((Control)host.RootComponent).Text = "Resize ended.";
        }
    }
}

Если вы хотите провести некоторые исследования и разработки, прежде чем приступить к этому решению, вы можете взглянуть на следующие классы (в основном внутренние) в System.Design сборке: GrabHandleGlyph, ResizeBehavior.

...