You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:45:02