滚动视图控件的视口大小更改事件

6

我有一些自定义计算,根据ScrollViewer的视口尺寸来更改控件的尺寸。目前,我在获取ScrollViewer.SizeChanged事件时进行这些计算。但是,似乎SizeChanged事件在ScrollViewer更新ViewPort尺寸之前执行。我的SizeChanged事件处理程序显示一个带有更新为新尺寸的Width和Height的ScrollViewer发送器,但ViewportWidth和ViewportHeight属性仍是旧的尺寸。

是否有一种方法可以在这些值更改后执行代码?


你解决了吗?我在这里看到了相同的效果。视口大小由滚动条的宽度/高度加上增量而不同。我还没有真正理解发生了什么。它只是变得奇怪了。 - l33t
不是...我只使用了ActualWidth和ActualHeight。 :/ - sohum
3个回答

11
根据MSDN的说明,您需要检查ScrollViewer的ScrollChanged事件。当它触发时,表示视口宽度或视口高度已更改。

OnScrollChanged 当检测到滚动状态的更改时调用,例如滚动位置、范围或视口大小的更改。


很遗憾,尽管实际视口大小被调整,但是当你调整父窗口大小时,ScrollChanged事件不会触发。 - Maksim Satsikau

6

我曾经遇到同样的问题,需要在ScrollViewer调整大小时知道Viewport的新尺寸。

由于SizeChanged在调整Viewport之前触发,因此要获取新的Viewport大小,只需通过SizeChangedEventArgs传递的旧大小和新大小之间的差异,并将其应用于当前的Viewport大小即可,方法如下:

    private void ScrollViewer_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        var sv = sender as ScrollViewer;

        var newViewportHeight = sv.ViewportHeight - e.PreviousSize.Height + e.NewSize.Height;
        var newViewportWidth = sv.ViewportWidth - e.PreviousSize.Width + e.NewSize.Width;
    }

0
我建议您继续监听SizeChanged事件。订阅该事件并在处理程序中询问ScrollViewer其视口,但使用Background或Loaded优先级分派该请求。 ScrollViewer的当前大小应该与视口大小相差不大。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接