C# WinForms设计图面上控件的BeginResize/EndResize事件
TLDR:我想知道如何在设计器界面上为设计时控件实例的开始调整大小和结束调整大小事件创建挂钩C# WinForms设计图面上控件的BeginResize/EndResize事件,c#,.net,winforms,windows-forms-designer,design-surface,C#,.net,Winforms,Windows Forms Designer,Design Surface,TLDR:我想知道如何在设计器界面上为设计时控件实例的开始调整大小和结束调整大小事件创建挂钩 详细信息:具体来说,我正在使用System.design和System.Component.design.NET命名空间中的BasicLoader生成的设计图面。具体来说,我正在处理TableLayoutPanel的一个设计时实例。该控件公开了一个SizeChanged事件和一个Resize事件——唉,这两个事件都是在调整大小操作期间触发的——也就是说,当控件正在调整大小时——以及调整大小操作完成时。
详细信息:具体来说,我正在使用System.design和System.Component.design.NET命名空间中的BasicLoader生成的设计图面。具体来说,我正在处理TableLayoutPanel的一个设计时实例。该控件公开了一个SizeChanged事件和一个Resize事件——唉,这两个事件都是在调整大小操作期间触发的——也就是说,当控件正在调整大小时——以及调整大小操作完成时。因此,我无法知道调整大小操作何时开始,何时正式结束 解决这个问题的一种方法是检测鼠标按下事件和调整大小事件——但我不清楚如何在正在调整大小的控件的任何抓取手柄上检测鼠标按下事件 对于记录,我重新访问了BehaviorService,发现它公开了开始拖动、结束拖动、和同步——我在该服务中没有看到任何有助于我处理开始缩放/结束调整大小事件的内容 因此,理想情况下,我希望为Winform控件的任何设计器实例订阅BeginResize/EndResize事件,但如果提供的答案仅涵盖将这些事件附加到TableLayoutPanel控件的设计器实例的需要,我会很高兴
有什么想法吗?当开始调整大小时,具有特定描述的设计器事务开始,当设计结束时,事务将关闭 您可以依赖
IDesignerHost
的TransactionOpened
事件,检查TransactionDescription
以查看它是否以“Resize”
开头,将标志resizeing
设置为true
。然后在TransactionClosed
中,您可以检查标志是否为true
,这意味着发生了调整大小结束
示例
下面是一个PoC来展示它是如何工作的。将以下控件添加到Windows窗体项目中,并在生成项目后,在窗体上删除MyControl
的实例。然后,如果尝试调整表单大小,您将看到调整大小开始。
和调整大小结束。
表单标题栏上的文本:
代码如下:
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
assembly中的以下类(主要是内部类):GrabHandleGlyph
,ResizeBehavior
,真棒,精彩等:)无尽的感谢。