2010-06-07 4 views
0

Я создал простой scrollviewer (pnlDayScroller) и хочу иметь отдельную горизонтальную полосу прокрутки (связанный скроллер) для выполнения горизонтальной прокрутки. Все работает с приведенным ниже кодом. Мне нужно привязать видимость связанного скроллера.Wpf привязка к функции

Я не могу просто привязать это к свойству видимости горизонтальной части шаблона средства просмотра прокрутки, поскольку я установил, что это всегда скрыто. Единственный способ, которым я могу думать, чтобы сделать это, чтобы связать видимость связанной скроллер с функцией такой, что

If associatedScroller.scrollableWidth > 0 then 
    associatedScroller.visibility = visibility.visible 
else 
    associatedScroller.visibility = visibility.collapsed 
end if 

Возможно ли это сделать, и если да, то как я могу это сделать?

Private Sub pnlDayScroller_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles pnlDayScroller.Loaded 

     Dim binViewport, binMax, binMin, binSChange, binLChange As Binding 


     Dim horizontalScrollBar As Primitives.ScrollBar = CType(pnlDayScroller.Template.FindName("PART_HorizontalScrollBar", pnlDayScroller), Primitives.ScrollBar) 

     binViewport = New Binding("ViewportSize") 
     binViewport.Mode = BindingMode.OneWay 
     binViewport.Source = horizontalScrollBar 
     associatedScroller.SetBinding(Primitives.ScrollBar.ViewportSizeProperty, binViewport) 

     binMax = New Binding("Maximum") 
     binMax.Mode = BindingMode.OneWay 
     binMax.Source = horizontalScrollBar 
     associatedScroller.SetBinding(Primitives.ScrollBar.MaximumProperty, binMax) 

     binMin = New Binding("Minimum") 
     binMin.Mode = BindingMode.OneWay 
     binMin.Source = horizontalScrollBar 
     associatedScroller.SetBinding(Primitives.ScrollBar.MinimumProperty, binMin) 

     binSChange = New Binding("SmallChange") 
     binSChange.Mode = BindingMode.OneWay 
     binSChange.Source = horizontalScrollBar 
     associatedScroller.SetBinding(Primitives.ScrollBar.SmallChangeProperty, binSChange) 

     binLChange = New Binding("LargeChange") 
     binLChange.Mode = BindingMode.OneWay 
     binLChange.Source = horizontalScrollBar 
     associatedScroller.SetBinding(Primitives.ScrollBar.LargeChangeProperty, binLChange) 
End Sub 

    Private Sub associatedScroller_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.RoutedPropertyChangedEventArgs(Of Double)) Handles associatedScroller.ValueChanged 
     pnlDayScroller.ScrollToHorizontalOffset(e.NewValue) 
end sub 

ПОСЛЕДУЮЩИЕ (спасибо JustABill):

Я добавить этот код в суб pnlDayScroller выше (я обнаружил scrollableWidth этого свойства ScrollViewer не скроллинг, но максимальное свойство дает результат можно использовать вместо)

binVisibility = New Binding("Maximum") 
    binVisibility.Mode = BindingMode.OneWay 
    binVisibility.Source = horizontalScrollBar 
    binVisibility.Converter = New ScrollableConverter 
    associatedScroller.SetBinding(Primitives.ScrollBar.VisibilityProperty, binVisibility) 

и я создал этот класс

Public Class ScrollableConverter 
     Implements IValueConverter 

      Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, 
      ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.Convert 

      Dim dblMaximum As Double 

      If targetType IsNot GetType(Visibility) Then 
       Throw New InvalidOperationException("The target must be a visibility") 
      Else 


       dblMaximum = CType(value, Double) 
       Debug.WriteLine("Value of double is " & dblMaximum) 

       If dblMaximum > 0 Then 
        Return Visibility.Visible 
       Else 
        Return Visibility.Collapsed 
       End If 
      End If 

     End Function 

     Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, 
      ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack 

      Throw New NotSupportedException() 
     End Function 

End Class 

И проблема решена.

+0

После комментариев JustABill я добавил некоторые последующие действия выше – user360349

ответ

0

Вам нужен ValueConverter. Привяжите свойство scrollableWidth и добавьте ValueConverter в свойство конвертера привязки. Этот пример на C#, но концепция довольно проста, и я уверен, что есть примеры VB.Net, если вы посмотрите.

Короткая форма того, что вам нужно сделать, это:

  1. Создайте новый класс, который реализует IValueConverter (я думаю, что это в System.ComponentModel).
  2. Заполните метод Convert первым кодом, за исключением использования параметра «значение» вместо scrollableWidth и возврата видимости.
  3. Добавьте соответствующие xmlns для ваших локальных классов.
  4. Добавить StaticResource вашего нового ValueConverter в ваше окно/UserControl/что угодно.
  5. Привязать свойство Видимость к свойству scrollableWidth, используя этот ValueConverter.
Смежные вопросы