1

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

我的 WPF 控件有一个 Canvas,它填充了我用来放置子项的空间,这些子项是从 Canvas 派生的自定义类。

我订阅了主 Canvas 的 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;
    }

画布的子项似乎以正确的速率缩放,并且画布似乎以更高的速率缩放。

有没有人看到任何原因/知道可能发生这种情况的任何原因?

行为图片...注意较小面板后面的空白区域

IMG

缩放 IMG

4

2 回答 2

5

这:

我订阅了主 Canvas 的 SizeChanged 事件并应用了缩放变换,以便在调整控件大小时,画布及其子项会像缩放一样缩小和增长,这正在工作,但由于某种原因,父画布正在缩小比孩子们高得多的比率,使孩子们因为缩放率而在某个点从画布上掉下来。

是 a 的Viewbox作用。将 aViewbox作为 WPF 可视化树中的根元素。并将其Stretch属性设置为适合您需要的任何内容。并删除所有大小计算。WPF 不需要大小计算。

于 2013-03-11T17:48:26.363 回答
1

看起来您缺少一些中间步骤(即一些大小更改)。如果您的应用程序无法足够快地处理大小更改事件,Windows 可能会在中间跳过一些以赶上

例如,假设您的应用程序以 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

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

于 2013-03-11T17:33:35.983 回答