I want to be notified of changes to the VerticalOffset of the vertical scrollbar of a ScrollViewer. In WPF there is a ScrollViewer.ScrollChanged event, but in Silverlight 3 this is missing. Does anyone know a workaround?
+1
A:
You can use element binding, here is a daft example:-
<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="60" />
</Grid.RowDefinitions>
<ScrollViewer x:Name="ScrollSource">
<StackPanel>
<TextBlock>Hello</TextBlock>
<TextBlock>World</TextBlock>
<TextBlock>Yasso</TextBlock>
<TextBlock>Kosmos</TextBlock>
</StackPanel>
</ScrollViewer>
<TextBox Grid.Column="1" Text="{Binding VerticalOffset, ElementName=ScrollSource}" />
</Grid>
As the ScrollViewer
is scrolled the Text property of the TextBox is advised of the new value.
AnthonyWJones
2009-11-19 11:11:25
Thanks for the tip! Instead of in WPF just subscribing to the ScrollChanged event, I now bind a custom dependency property to the scrollviewer's VerticalOffset, and use a callback for the dependency property to be able to do something with the changed values in code. At least it works :p
eriksmith200
2009-11-19 12:17:29
A:
There's an easier solution that featured on the silverlight forums:
protected override Size ArrangeOverride(Size finalSize)
{
// Assumes you only have one scrollviewer (e.g. fullscreen ScrollViewer)
var scrollbar = LayoutRoot.GetVisualDescendants()
.OfType<ScrollBar>()
.FirstOrDefault();
if (scrollbar != null)
scrollbar.Scroll += ScrollBarScroll;
return base.ArrangeOverride(finalSize);
}
private void ScrollBarScroll(object sender, ScrollEventArgs e)
{
}
Chris S
2010-05-25 09:34:33
A:
here is a good link which i found while googling, it also has some sample code which i haven't checked out.
http://dotplusnet.blogspot.com/2010/05/scrollviewer-scroll-change-event-in.html
Devper
2010-09-14 18:02:14