【问题标题】:Synchronizing a WPF ScrollViewer with a WinForms ScrollBar将 WPF ScrollViewer 与 WinForms ScrollBar 同步
【发布时间】:2011-08-06 12:14:47
【问题描述】:

由于我当前的项目 [Weird scrollbar UI in hosted WPF composite control] 中有一个未解决的问题,我不得不推迟解决方法。我想出的一个这样的想法是让有问题的 ScrollViewer 与 Windows 窗体 ScrollBar(水平和垂直)保持同步。我该怎么做呢?

本质上,我希望 WinForms 滚动条像 ScrollViewers 一样工作(在拖动和事件等方面)。

【问题讨论】:

    标签: wpf winforms binding interop scroll


    【解决方案1】:

    我认为除了发送/收听低级 API Windows 消息传递之外别无他法。您应该对 Win API 以及如何管理它们有相当的了解。我还要补充一点,滚动条是要管理的中等复杂任务,但也许是我……

    这是vertical scroll message 参考。

    【讨论】:

    • 我的印象是 WPF 使用与 Win32/WinForms 不同的测量比例。你会碰巧知道这件事吗?
    • 我没说这很容易。但是,通过查看 ScrollViewer 代码,似乎它使用了相同的 API。换句话说,滚动条应该总是相同的,不管顶层 UI。
    【解决方案2】:

    我设法实现了它,而无需过多使用 WinAPI。我是这样做的:

    1. 向滚动查看器注册了一个 ScrollOffsetChanged 事件处理程序(实现 IScrollInfo 接口的复合控件公开了该事件)。
    2. 向窗体滚动条注册了一个 ValueChanged 事件处理程序。
    3. 几个信号标志可防止循环调用事件处理程序。
    4. 第一个处理程序调用了 UpdateExternalScrollBars() 函数,该函数使用以下表达式计算了 Maximium Scrollbar 属性:ScrollViewer->ExtentHeight/Width - ScrollViewer->ViewportHeight/Width。 Value 属性直接设置为 ScrollViewer->Vertical/Horizo​​ntalOffset。
    5. 第二个从窗体滚动条获取 Value 属性并将其传递给 ScrollViewer->ScrollToVertial/Horizo​​ntalOffset()。信号标志已预先适当设置。

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 2011-09-30
      • 2011-09-25
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      相关资源
      最近更新 更多