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

WPF Canvas中解决TextBlock因坐标转换导致镜像显示的问题

解决WPF Canvas中TextBlock因坐标系适配导致的镜像问题

问题根源在于Canvas的LayoutTransform设置了ScaleY=-1,会让所有子元素垂直翻转,TextBlock的文字自然也会被镜像。要解决这个问题,只需要给每个TextBlock单独添加反向的翻转变换,抵消Canvas的全局翻转,同时调整位置锚点保证坐标匹配。

方案一:使用LayoutTransform并调整位置

给TextBlock添加ScaleTransform(1, -1),同时因为翻转后TextBlock的锚点从左上角变成左下角,需要用原始Top坐标减去文本高度来修正位置:

public void DrawMtext(List<(string, double, List<double>)> canvasMtextList)
{
    foreach ((string, double, List<double>) mtext in canvasMtextList)
    {
        TextBlock textBlock = new TextBlock();
        textBlock.Text = mtext.Item1;
        textBlock.FontSize = Math.Ceiling(mtext.Item2 * 5);

        // 添加反向翻转,抵消Canvas的垂直翻转
        textBlock.LayoutTransform = new ScaleTransform(1, -1);

        // 先测量文本高度,修正Top位置
        textBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
        Canvas.SetLeft(textBlock, mtext.Item3[0]);
        Canvas.SetTop(textBlock, mtext.Item3[1] - textBlock.DesiredSize.Height);

        map_page_canvas.Children.Add(textBlock);
    }
}

方案二:使用RenderTransform并设置锚点

通过设置RenderTransformOrigin为左下角,再添加反向翻转,这样不需要手动计算高度,位置会自动匹配:

public void DrawMtext(List<(string, double, List<double>)> canvasMtextList)
{
    foreach ((string, double, List<double>) mtext in canvasMtextList)
    {
        TextBlock textBlock = new TextBlock();
        textBlock.Text = mtext.Item1;
        textBlock.FontSize = Math.Ceiling(mtext.Item2 * 5);

        // 设置翻转锚点为左下角,再添加反向翻转
        textBlock.RenderTransformOrigin = new Point(0, 1);
        textBlock.RenderTransform = new ScaleTransform(1, -1);

        // 直接使用原始坐标即可,锚点设置后位置自动适配
        Canvas.SetLeft(textBlock, mtext.Item3[0]);
        Canvas.SetTop(textBlock, mtext.Item3[1]);

        map_page_canvas.Children.Add(textBlock);
    }
}

两种方案都能让TextBlock正常显示,建议优先用方案二,位置计算更简洁,不需要提前测量文本尺寸。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:40:17