我希望我的UserControl自动更新其Region属性。我希望它是儿童控件区域合并在一起的组合。
这是我到目前为止所做的:
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
Region region = new Region(new Rectangle(Point.Empty, Size.Empty));
foreach (Control control in Controls)
{
if (control.Region != null)
region.Union(control.Region);
else
region.Union(control.Bounds);
}
Region = region;
Invalidate();
}
问题是它不起作用:必须更改行region.Union(control.Region);
,因为Region不包含有关控件左移和上移的信息。
我该怎么办?
答案 0 :(得分:1)
您可以选择 选择实际构成Rectangles
的{{1}}。您可以通过Region
获取它们。您可以在this post中看到它们。
或使用GetRegionScans
您的子控件“GraphicsPaths
来自...
在这两种方法中,您可以按控件的位置移动控件的区域数据:通过偏移每个矩形或翻译整个图形路径。
此处是第一种方法的代码示例:
Regions
问题在于,{{1>}形状的'垂直'尺寸和复杂性会越来越慢......
其他方式是跟踪子控件的if (control.Region != null)
{
Matrix matrix = new Matrix(); // default, unscaled screen-resolution matrix
var rex = control.Region.GetRegionScans(matrix); // get rectangles
foreach (var r in rex) // use each of them
{
r.Offset(control.Location); // move by the location offsets
region.Union(r);
}
else
{
region.Union(control.Bounds);
}
。
假设一个具有控制属性的类Region
GraphicsPaths
您可以将循环更改为:
PathControl