【问题标题】:Event on ScrollViewer's Viewport size changedScrollViewer 的视口大小上的事件已更改
【发布时间】:2014-03-09 23:34:27
【问题描述】:

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

有没有办法在这些值更改后执行代码?

【问题讨论】:

  • 你解决了吗?我在这里看到了同样的效果。视口大小因滚动条的宽度/高度加上增量而有所不同。还真没搞懂是怎么回事。它变得很奇怪。
  • 不...我只是选择了 ActualWidth 和 ActualHeight。 ://

标签: c# wpf scrollviewer


【解决方案1】:

有同样的问题,当调整 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;
    }

【讨论】:

    【解决方案2】:

    根据MSDN,您检查ScrollViewer 的ScrollChanged 事件。当它触发时,意味着 viewportwidth 或 viewportheight 发生了变化。

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

    【讨论】:

    • 不幸的是,当您调整父窗口大小时,ScrollChanged 不会触发,尽管实际视口大小已调整
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      相关资源
      最近更新 更多