【问题标题】:BeginResize/EndResize Event for Control on WinForms Design SurfaceWinForms 设计界面上控件的 BeginResize/EndResize 事件
【发布时间】:2020-01-28 07:04:56
【问题描述】:

TLDR:我想知道如何为设计器界面上的设计时控件实例创建一个挂钩到 begin-resize 和 end-resize 事件。


详细信息: 具体来说,我正在使用由 System.Design 和 System.Component.Design .NET 命名空间中的 BasicLoader 生成的设计图面。具体来说,我正在使用 TableLayoutPanel 的设计时实例。该控件公开了一个 SizeChanged 事件和一个 Resize 事件--唉,两者都在 调整大小操作时触发 - 即 控件正在调整大小 - 以及调整大小操作完成的时间。因此,我无法知道调整大小操作何时开始以及何时正式结束。

解决此问题的一种方法是检测鼠标按下事件和调整大小事件 - 但我不清楚如何在任何抓握手柄上检测鼠标按下事件 正在调整大小的控件。

为了记录,我重新访问了 BehaviorService,发现它公开了 BeginDragEndDragSynchronize——我什么也没看到可以帮助我处理 BeginResize/EndResize 事件的服务。

因此,理想情况下,我想为 Winform 控件的任何设计器实例订阅 BeginResize/EndResize 事件,但如果提供的答案仅涵盖我需要将这些事件附加到TableLayoutPanel 控件...

有什么想法吗?

【问题讨论】:

    标签: c# .net winforms windows-forms-designer design-surface


    【解决方案1】:

    当调整大小开始时,具有特定描述的设计器事务开始,当设计结束时,事务将被关闭。

    您可以依赖IDesignerHostTransactionOpened 事件并检查TransactionDescription 以查看它是否以"Resize" 开头,将标志resizing 设置为true。然后在TransactionClosed你可以检查标志是否为true,这意味着它已经发生了resize结束。

    示例

    这是一个 PoC 来展示它是如何工作的。将以下控件添加到 Windows 窗体项目中,并在构建项目后,将 MyControl 的实例放在窗体上。然后,如果您尝试调整表单大小,您将在表单的标题栏上看到 Resize started.Resize ended. 文本:

    代码如下:

    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 程序集中的以下类(主要是内部类):GrabHandleGlyphResizeBehavior

    【讨论】:

    • 太棒了,太棒了,等等,等等,等等:)无尽的感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多