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

ScaleTransform的CenterX/CenterY对TextBlock与Line生效不一致问题

问题原因

你搞混了ScaleTransform中CenterX/CenterY的坐标系——它们是元素自身的局部坐标系坐标,不是Canvas的全局坐标。你把Canvas的全局中心赋值给TextBlock的缩放中心,而TextBlock在Canvas上的位置和这个全局中心不重合,自然会导致缩放时偏移。

另外你代码里还有个小问题:每次缩放都新建ScaleTransform,不仅没必要,还可能导致之前的Transform设置丢失,应该复用已有的Transform对象。

解决方法

方法1:给TextBlock设置自身中心作为缩放原点

用RenderTransformOrigin直接指定缩放中心为元素自身的比例中心(0.5,0.5),这样不管TextBlock多大,缩放都会以它自己的中心进行:

public void ScaleDown()
{
    scale *= 0.90;

    // 复用线条的ScaleTransform
    ScaleTransform lineTransform = Line1.RenderTransform as ScaleTransform ?? new ScaleTransform();
    lineTransform.ScaleX = scale;
    lineTransform.ScaleY = scale;
    // 给线条设置自身中心缩放,代替全局坐标
    Line1.RenderTransformOrigin = new Point(0.5, 0.5);
    Line2.RenderTransformOrigin = new Point(0.5, 0.5);
    Line1.RenderTransform = lineTransform;
    Line2.RenderTransform = lineTransform;

    // 复用文本的ScaleTransform
    ScaleTransform textTransform = NameText.RenderTransform as ScaleTransform ?? new ScaleTransform();
    textTransform.ScaleX = scale;
    textTransform.ScaleY = scale;
    // 设置文本缩放中心为自身中心
    NameText.RenderTransformOrigin = new Point(0.5, 0.5);
    NameText.RenderTransform = textTransform;
}

方法2:用容器统一管理元素(更推荐)

把十字线和TextBlock放到同一个容器(比如Canvas)里,给容器设置统一的缩放Transform,这样所有子元素会一起以容器中心缩放,避免单独处理每个元素:

// 初始化时创建容器(只做一次)
Canvas pointContainer = new Canvas();
pointContainer.Children.Add(Line1);
pointContainer.Children.Add(Line2);
pointContainer.Children.Add(NameText);
// 设置容器在Canvas中的位置(对应你的点坐标,根据十字线尺寸调整偏移)
Canvas.SetLeft(pointContainer, CanvasCenter[0] - 10);
Canvas.SetTop(pointContainer, CanvasCenter[1] - 10);
YourMainCanvas.Children.Add(pointContainer);

// 缩放方法
public void ScaleDown()
{
    scale *= 0.90;

    ScaleTransform containerTransform = pointContainer.RenderTransform as ScaleTransform ?? new ScaleTransform();
    containerTransform.ScaleX = scale;
    containerTransform.ScaleY = scale;
    // 设置容器缩放中心为自身中心
    pointContainer.RenderTransformOrigin = new Point(0.5, 0.5);
    pointContainer.RenderTransform = containerTransform;
}
关键说明
  • RenderTransformOrigin是按元素自身尺寸的比例取值,(0.5,0.5)就是元素的中心点,比直接设置CenterX/CenterY更灵活,不需要计算元素的实际宽高。
  • 复用已有的ScaleTransform对象,避免每次新建带来的性能开销和状态丢失。

内容的提问来源于stack exchange,提问作者HillbillyHarry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:55:21