gpt4 book ai didi

c# - WPF中奇怪的缩放问题

转载 作者:行者123 更新时间:2023-12-03 21:38:28 26 4
gpt4 key购买 nike

我有一个 Canvas ,我在上面放了一些东西,然后缩放它。但是,当您运行比例时,它们并不是从应有的点开始的,例如,如果您从一个原点稍微缩放,然后从另一个原点缩放,则第二个原点的作用就好像它在实际中有所偏移一样奇怪的时尚而不是按预期行事(以及第一个起源的行为)。我一直在使用代码来执行缩放:

        foreach (UIElement element in canvas1.Children)
{
Point p = e.MouseDevice.GetPosition(element);
Matrix m = element.RenderTransform.Value;
if (e.Delta > 0)
m.ScaleAt(1.1, 1.1, p.X, p.Y);
else
m.ScaleAt(1 / 1.1, 1 / 1.1, p.X, p.Y);
element.RenderTransform = new MatrixTransform(m);
}

到底发生了什么?

我意识到我原来的问题文本并不那么清晰。我从鼠标原点进行缩放,因此您将鼠标移动到示例文本对象对的左侧,滚动滚轮,它们会以完美的方式放大或缩小并在屏幕上移动。但是,如果您随后将鼠标移动到对象另一侧的右侧,并尝试滚动,那么它们的作用就像鼠标在它们中间一样 - 也就是说,它们会放大和缩小,而不会在屏幕上移动完全没有。

最佳答案

当您使用 ScaleAt 创建转换时,您也在创建翻译。例如,如果鼠标指针位于元素左侧 100 像素处,则将其缩放 1.1 并向右移动 10 像素。下次运行代码时,您也会缩放该翻译,因此除了新翻译之外,还要将其向右再移动 1 个像素。

一种解决方案是在应用比例之前将平移与先前的矩阵分开,然后将其添加回末尾:

foreach (UIElement element in canvas1.Children)
{
Point p = e.MouseDevice.GetPosition(element);
Matrix m = element.RenderTransform.Value;
Matrix m2 = m;
m2.Translate(-m.OffsetX, -m.OffsetY);
if (e.Delta > 0)
m2.ScaleAt(1.1, 1.1, p.X, p.Y);
else
m2.ScaleAt(1 / 1.1, 1 / 1.1, p.X, p.Y);
m2.Translate(m.OffsetX, m.OffsetY);
element.RenderTransform = new MatrixTransform(m2);
}

类似的选项是始终从 RenderTransform 中删除缩放并将其编码在 Canvas.Left 和 Canvas.Top 中:

foreach (UIElement element in canvas1.Children)
{
Point p = e.MouseDevice.GetPosition(element);
Matrix m = element.RenderTransform.Value;
if (e.Delta > 0)
m.ScaleAt(1.1, 1.1, p.X, p.Y);
else
m.ScaleAt(1 / 1.1, 1 / 1.1, p.X, p.Y);
Canvas.SetLeft(element, Canvas.GetLeft(element) + m.OffsetX);
Canvas.SetTop(element, Canvas.GetTop(element) + m.OffsetY);
m.Translate(-m.OffsetX, -m.OffsetY);
element.RenderTransform = new MatrixTransform(m);
}

更新:实际上,我认为我错过了更大的相关效果。因为您在旧比例之后应用新比例,所以 p.X 和 p.Y 的平移在不应该的情况下被缩放。当规模很大时,这会产生很大的误差(而我上面提到的误差始终是 10% 的误差)。

尝试使用ScaleAtPrepend首先应用新的转换:

foreach (UIElement element in canvas1.Children)
{
Point p = e.MouseDevice.GetPosition(element);
Matrix m = element.RenderTransform.Value;
if (e.Delta > 0)
m.ScaleAtPrepend(1.1, 1.1, p.X, p.Y);
else
m.ScaleAtPrepend(1 / 1.1, 1 / 1.1, p.X, p.Y);
Canvas.SetLeft(element, Canvas.GetLeft(element) + m.OffsetX);
Canvas.SetTop(element, Canvas.GetTop(element) + m.OffsetY);
m.Translate(-m.OffsetX, -m.OffsetY);
element.RenderTransform = new MatrixTransform(m);
}

关于c# - WPF中奇怪的缩放问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3675780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com