创建委托以更改 UserControl 大小
Posted
技术标签:
【中文标题】创建委托以更改 UserControl 大小【英文标题】:Create a delegate to change UserControl size 【发布时间】:2021-11-30 07:21:42 【问题描述】:我已经创建了一个名为 TQSSetpointEditor 的 UserControl,从所有意图和目的来看,它只是一个显示有关对象的一些信息的控件。
我正在尝试让用户控件更改其宽度以始终适合窗口/窗体的大小减去偏移量以在控件和边缘之间添加一点边框。
我不能只停靠这些项目的原因是该项目位于另一个名为 TQSSetpointGroup 的自定义用户控件中,该控件托管一组 TQSSetpointEditor。 TQSSetpoint 组只是一个流程布局面板,因此我无法将项目停靠在控件中,因为它没有按照我想要的方式执行。
我发现最简单的解决方案是通过委托将设置点编辑器的宽度更改为窗口的宽度。问题是我根本不知道如何使用委托,更不用说以实际的方式使用了。
我的想法是每当调整表单大小时,回调到 TQSSetpointEditor,然后将控件的宽度调整为表单的新宽度。
图 1:
正如您从图像中看到的那样,用户控件越过表单的右侧,但我希望用户控件通过从实例发送信息的委托根据表单的宽度动态调整其宽度的形式到 setpointeditor 控件的所有实例(主要是因为我想知道如何正确使用委托)。
【问题讨论】:
【参考方案1】:解决办法: 将公共委托放在同一个命名空间中:
public delegate void ResizeControlCallback(Size newSize);
然后将委托的实例放入您要从中发送数据的表单中:
// Delegate to change the size of each editor based on the size of the form.
public event ResizeControlCallback ResizeControl;
/// <summary>
/// Sends over the size of the form everytime it's resized to give the controls a dynamic feel.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void HandleChildControlResize(object sender, EventArgs args)
if (ResizeControl != null) ResizeControl(Size);
然后在您要侦听的控件中,并根据事件更改其属性,为其添加事件侦听器,然后从参数中“获取”值。
WrapperForm.Instance.ResizeControl += HandleResize;
/// <summary>
/// Resizes the editor width, based on the width of the wrapperform, also changes the padding based on the width;
/// </summary>
/// <param name="newSize"></param>
private void HandleResize(Size newSize)
Width = newSize.Width - RightOffset;
Height = EditorSize.Height;
if (Width <= 500) defaultMargin = new Padding(0, 12, 0, 0);
if (Width > 501 && Width <= 750) defaultMargin = new Padding(10, 12, 1, 10);
if (Width > 751 && Width <= 1000) defaultMargin = new Padding(20, 12, 20, 0);
if (Width > 1001 && Width <= 1500) defaultMargin = new Padding(30, 12, 30, 0);
if (Width >= 1501) defaultMargin = new Padding(40, 12, 40, 0);
spidNameLbl.Margin = defaultMargin;
unitMeasureLbl.Margin = defaultMargin;
tdtsControl.Margin = defaultMargin;
warningLbl.Margin = defaultMargin;
utcModifiedLbl.Margin = defaultMargin;
notesLbl.Margin = defaultMargin;
因此,每次调整窗体大小时,控件的宽度也会随之调整。
【讨论】:
虽然性能不会很好。以上是关于创建委托以更改 UserControl 大小的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Blend 中动态更改 UserControl 的外观?
“WPF UserControl.Unloaded”选项卡更改与卸载