我有一些自定义计算,可根据ScrollViewer视口的尺寸更改控件的尺寸。目前,我在获取ScrollViewer.SizeChanged事件时进行了这些计算。但是,似乎在ScrollViewer更新ViewPort维度之前执行了SizeChanged事件。我的SizeChanged事件处理程序显示了一个ScrollViewer发件人,其Width和Height已更新为新维度,但ViewportWidth和ViewportHeight属性属于旧维度。
一旦这些值发生变化,有没有办法执行代码?
答案 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;
}