ScrollViewer的视口大小上的事件已更改

时间:2014-02-11 22:26:19

标签: c# wpf scrollviewer

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

一旦这些值发生变化,有没有办法执行代码?

3 个答案:

答案 0 :(得分:10)

根据MSDN,您检查ScrollViewer的ScrollChanged事件。当它触发时,意味着视口宽度或视口高度已经改变。

  

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

答案 1 :(得分:0)

我建议你继续听SizeChanged事件。订阅该事件并向ScrollViewer询问其处理程序内部的Viewport BUT使用Background或Loaded prority调度该请求。 ScrollViewer的当前大小应该或多或少等于Viewport。

答案 2 :(得分:0)

遇到了同样的问题,当调整ScrollViewer的大小时,我需要知道视口的新大小。

在调整视口之前会触发SizeChanged,因此,要获取新的视口大小,您可以简单地获取通过SizeChangedEventArgs传递的旧大小与新大小之间的差异,然后将其应用于当前视口大小,如下所示:

    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;
    }