C# 画布上的ScaleTransform resize以比子级更高的速率收缩画布

C# 画布上的ScaleTransform resize以比子级更高的速率收缩画布,c#,wpf,winforms,wpf-controls,C#,Wpf,Winforms,Wpf Controls,我有一个WPF控件停靠在WinForms应用程序中的WPF主机控件中。WPF控件设置为水平和垂直拉伸,并且主机控件停靠在锚定的组框中 我的WPF控件有一个画布,它填充了我用来放置子对象的空间,子对象是从画布派生的自定义类 我订阅了主画布的SizeChanged事件,并应用了缩放变换,以便在调整控件大小时,画布及其子画布将以类似缩放的方式收缩和增长,这是可行的,但由于某些原因,父画布的收缩率比子画布的收缩率高得多,让孩子们在某一点从画布上掉下来,因为比例的关系 这是我的代码: privat

我有一个WPF控件停靠在WinForms应用程序中的WPF主机控件中。WPF控件设置为水平和垂直拉伸,并且主机控件停靠在锚定的组框中

我的WPF控件有一个画布,它填充了我用来放置子对象的空间,子对象是从画布派生的自定义类

我订阅了主画布的SizeChanged事件,并应用了缩放变换,以便在调整控件大小时,画布及其子画布将以类似缩放的方式收缩和增长,这是可行的,但由于某些原因,父画布的收缩率比子画布的收缩率高得多,让孩子们在某一点从画布上掉下来,因为比例的关系

这是我的代码:

    private void EditorCanvas_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        if (e.PreviousSize.Width == 0)
            return;
        double YDiff = e.PreviousSize.Height / e.NewSize.Height;
        double XDiff = e.PreviousSize.Width / e.NewSize.Width;

        Scale.ScaleY /= YDiff;
        Scale.ScaleX /= XDiff;
    }
画布的子对象似乎以正确的速率缩放,而画布似乎以更高的速率缩放

有人知道发生这种情况的原因吗

行为图片。。。请注意较小面板后面的空白

以前

缩放

看起来您缺少了一些中间步骤,即一些尺寸更改。如果应用程序无法快速处理大小更改事件,则窗口可能会跳过中间部分以赶上。p> 例如,假设你的应用程序以1000的高度开始。然后很快变为100,但在这个过程中,它经过了许多中间尺寸500、250、125。如果您遗漏了其中的一个或两个,您将在ScaleY计算中得到如下结果:

0. Height = 1000; ScaleY = 1
1. Height: 1000 > 500; ScaleY = 1/(1000/500) = 0.5
2. [misses 250]; no scaleY adjustment
3. Height: 250 > 125; ScaleY = 0.5 / (250/125) = 0.25  // when it should actually be .125
4. Height: 125 > 100; ScaleY = 0.25 / (125/100) = 0.2  // when it should actually be 0.1

相反,您应该存储和使用原始大小并计算绝对值,而不是连续微分。

看起来您缺少了一些中间步骤,即一些大小更改。如果应用程序无法快速处理大小更改事件,则窗口可能会跳过中间部分以赶上。p> 例如,假设你的应用程序以1000的高度开始。然后很快变为100,但在这个过程中,它经过了许多中间尺寸500、250、125。如果您遗漏了其中的一个或两个,您将在ScaleY计算中得到如下结果:

0. Height = 1000; ScaleY = 1
1. Height: 1000 > 500; ScaleY = 1/(1000/500) = 0.5
2. [misses 250]; no scaleY adjustment
3. Height: 250 > 125; ScaleY = 0.5 / (250/125) = 0.25  // when it should actually be .125
4. Height: 125 > 100; ScaleY = 0.25 / (125/100) = 0.2  // when it should actually be 0.1
您应该存储和使用原始大小,并计算绝对值,而不是连续微分。

这:

我订阅了主画布的SizeChanged事件,并应用了一个比例 变换以使画布及其子对象在其中收缩和生长 当控件调整大小时,一种类似缩放的方式正在工作,但是 出于某种原因,父画布正在以更高的速度收缩 而不是孩子们,让孩子们一下子从画布上掉下来 某一点,因为比例比率


是Viewbox的功能。将Viewbox作为WPF可视化树中的根元素。并将其拉伸属性设置为任何适合您需要的值。并删除所有的尺寸计算。WPF不需要尺寸计算。

这:

我订阅了主画布的SizeChanged事件,并应用了一个比例 变换以使画布及其子对象在其中收缩和生长 当控件调整大小时,一种类似缩放的方式正在工作,但是 出于某种原因,父画布正在以更高的速度收缩 而不是孩子们,让孩子们一下子从画布上掉下来 某一点,因为比例比率


是Viewbox的功能。将Viewbox作为WPF可视化树中的根元素。并将其拉伸属性设置为任何适合您需要的值。并删除所有的尺寸计算。WPF不需要计算大小。

发布一个屏幕截图来解释问题。您在哪里应用ScaleTransform?它至少不应该应用于画布本身,因为当SizeChanged事件触发时,画布的大小已经改变了。这可能就是问题所在。ScaleTransform在SizeChanged事件上应用于整个画布。我将对此进行更深入的研究。发布一个屏幕截图来解释这个问题。您在哪里应用ScaleTransform?它至少不应该应用于画布本身,因为当SizeChanged事件触发时,画布的大小已经改变了。这可能就是问题所在。ScaleTransform在SizeChanged事件上应用于整个画布。我将进一步研究这个问题。WPF不需要尺寸计算。干得好。但在WPF中完全不需要。也许在恐龙身上是这样。看看我的答案。WPF不需要尺寸计算。干得好。但在WPF中完全不需要。也许在恐龙身上是这样。看看我接受的答案。我以前试过这个,但遇到了一个问题,当我把画布包装在一个视图框中时,它的孩子们会从画布上消失。我会读一点关于viewbox的内容,然后再给你回复,除非你知道发生这种情况的任何原因。@Gianni确保你给画布提供了一些平均尺寸
ng类宽度=500高度=500。我所说的平均尺寸是指在现实世界中你所期望的平均尺寸。。。哇!添加一个固定大小解决了这个问题。现在我想这是非常有意义的。谢谢Highcore我以前试过这个,但遇到了一个问题,当我将画布包装在一个viewbox中时,它的孩子们会从画布上消失。我会读一点关于viewbox的内容,然后再给你回复,除非你知道发生这种情况的任何原因。@Gianni确保你给画布提供一些平均尺寸,比如宽度=500高度=500。我所说的平均尺寸是指在现实世界中你所期望的平均尺寸。。。哇!添加一个固定大小解决了这个问题。现在我想这是非常有意义的。谢谢你HighCore