WPF中SizeChanged事件触发时矩形垂直位置不随窗口调整的问题
问题根源
你当前的矩形不跟随窗口高度调整的核心原因是:ChangeRectangleSize方法中计算垂直位置的逻辑完全没有关联窗口的实时高度,所有用到的30、recheight、numberrecs、recdistance都是初始化时传入的固定值,窗口高度变化时不会更新矩形的Top坐标,因此位置无变动。而水平居中逻辑用到了窗口的Width属性,所以宽度调整时可以正常跟随。
修复代码
如果你的预期效果是所有矩形整体在窗口垂直方向居中,修改ChangeRectangleSize方法如下:
public void ChangeRectangleSize(Rectangle[] recobject, int singleRecHeight, int numberrecs, int recdistance) { // 计算矩形组总高度:n个矩形高度 + (n-1)个间距 double totalGroupHeight = numberrecs * singleRecHeight + (numberrecs - 1) * recdistance; // 用窗口实际高度计算垂直居中的起始Top值,优先用ActualHeight取实时渲染高度 double startTop = (this.ActualHeight - totalGroupHeight) / 2; // 边界处理,窗口过小时保证最小顶部边距为30 startTop = startTop < 30 ? 30 : startTop; for (int i = 0; i < recobject.Length; i++) { // 水平居中改用ActualWidth,避免初始化阶段Width为0的异常 Canvas.SetLeft(recobject[i], this.ActualWidth / 2.0 - recobject[i].Width / 2.0); Canvas.SetTop(recobject[i], startTop + i * (singleRecHeight + recdistance)); } }
额外优化建议
- 调用上述方法时,
singleRecHeight参数传入你初始化矩形时设置的高度值即可,也可以直接在方法内通过recobject[i].Height获取,无需额外传参更简洁。 - 原初始化代码中
Content = myCanvas;写在for循环内属于冗余操作,移到循环外执行一次即可,避免不必要的渲染开销。
内容的提问来源于stack exchange,提问作者user17211775
相关产品推荐
相关产品推荐

