【问题标题】:Manually scrolling a ScrollBar on a ScrollViewer在 ScrollViewer 上手动滚动 ScrollBar
【发布时间】:2014-03-07 02:01:51
【问题描述】:

我的页面上有以下结构:

默认情况下,ScrollViewer 上有一个 ScrollBar。

var scrollbars = this.ScrollView.GetDescendantsOfType<ScrollBar>().ToList();
_scrollBar = scrollbars.FirstOrDefault(x => x.Orientation == Orientation.Horizontal);

我将 _scrollBar 的值绑定到滑块的值,将最大值绑定到最大值。

var valueBinding = new Binding();            
valueBinding.Source = _scrollBar;
valueBinding.Mode = BindingMode.TwoWay;
valueBinding.Path = new PropertyPath("Value");
BindingOperations.SetBinding(this.Slider, Slider.ValueProperty, valueBinding);

var maximumBinding = new Binding();
maximumBinding.Source = _scrollBar;
maximumBinding.Mode = BindingMode.OneWay;
maximumBinding.Path = new PropertyPath("Maximum");
BindingOperations.SetBinding(this.Slider, Slider.MaximumProperty, maximumBinding);

当我打开我的页面时,有一个滑块和默认滚动条。当我滑动/滚动滚动查看器时,滑块和滚动条同步滑动/滚动。现在,当我移动滑块时,滚动条也在移动,但不是 scrollViewer。滚动条滚动事件也不会被触发。当我用鼠标指针移动滚动条时,滑块和滚动查看器也在移动,滚动条滚动事件被触发。

我需要改变什么才能移动滑块和滚动查看器同步移动?

非常感谢

【问题讨论】:

    标签: c# windows-runtime scrollviewer


    【解决方案1】:

    您可以实现附加的属性/行为,该属性/行为将支持绑定到ScrollViewer 的偏移量。您的行为对象将通过调用例如响应属性值更改。 ScrollToVerticalOffset()ScrollViewer 上,并通过更新属性值来响应ViewChanged 事件。

    【讨论】:

      【解决方案2】:

      我使用事件处理程序而不是绑定生成了相同的功能。除了我这样做的方式的最大区别之外,我使用 Scrollviewer 的 Horizo​​ntalOffset 属性而不是 ScrollViewer 中的水平滚动条。也许这对你有用?

      这是我如何做到的示例。

      对不起,它是在VB中

      我认为这里唯一缺少的是我将滑块的最大值设置为 100。

      Private Sub myslider_ValueChanged(sender As System.Object, e As System.Windows.RoutedPropertyChangedEventArgs(Of System.Double)) 试试

              Dim sliderPercentage As Integer = myslider.Value
      
              If (sliderPercentage > 0) Then
      
                  sv.ScrollToHorizontalOffset((sv.ScrollableWidth / 100) * myslider.Value)
      
                  myscrollviwer.ScrollToHorizontalOffset((myscrollviwer.ScrollableWidth / 100) * myslider.Value)
      
              Else
                  sv.ScrollToHorizontalOffset(0)
                  myscrollviwer.ScrollToHorizontalOffset(0)
              End If
      
          Catch ex As Exception
      
          End Try
      End Sub
      

      私有子 myscrollviwer_ScrollChanged(sender As System.Object, e As System.Windows.Controls.ScrollChangedEventArgs)

          Try
      
              Dim scrollPercentage As Double = 0
      
              If (myscrollviwer.HorizontalOffset > 0) Then
      
                  scrollPercentage = (myscrollviwer.HorizontalOffset / myscrollviwer.ScrollableWidth) * 100
      
                  myslider.Value = scrollPercentage
              Else
                  myslider.Value = 0
              End If
      
          Catch ex As Exception
      
          End Try
      End Sub
      

      【讨论】:

      • 谢谢,我也试过了,但不能正常工作。你能发布一个代码示例吗?
      猜你喜欢
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      相关资源
      最近更新 更多