Chciałbym użyć metody ScrollToVerticalOffset przeglądarki ScrollViewer, aby przejść na górę przeglądarki scrollviewer.
Ale z aprobatą MVVM.
Myślę, że muszę utworzyć właściwość zależności, aby przyjąć to zachowanie.
EDYTOWAĆ : Zachowanie to:
public class ScrollPositionBehavior : Behavior<FrameworkElement>
{
public double Position
{
get { return (double)GetValue(PositionProperty); }
set { SetValue(PositionProperty, value); }
}
public static readonly DependencyProperty PositionProperty = DependencyProperty.Register("Position", typeof(double), typeof(ScrollPositionBehavior), new PropertyMetadata((double)0, new PropertyChangedCallback(OnPositionChanged)));
protected override void OnAttached()
{
base.OnAttached();
}
private static void OnPositionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ScrollPositionBehavior behavior = d as ScrollPositionBehavior;
double value = (double)e.NewValue;
((ScrollViewer)(behavior.AssociatedObject)).ScrollToVerticalOffset(value);
}
protected override void OnDetaching()
{
base.OnDetaching();
}
}
używane jak:
<ScrollViewer>
<Interactivity:Interaction.Behaviors>
<fxBehavior:ScrollPositionBehavior Position="{Binding Position}" />
</Interactivity:Interaction.Behaviors>
<other things ...>
</ScrollViewer>
z
xmlns:Interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:fxBehavior="clr-namespace:MyNamespace.Behavior;assembly=MyAssembly"
Mam wyjątek xaml analizatora składni:
to jest: AG_E_PARSER_BAD_PROPERTY_VALUE
Zauważ, że używam zachowania opartego na FrameworkElement, ponieważ używam silverlight 3 (w rzeczywistości jest to SL dla WP7). Widziałem, że powiązanie powinno działać tylko dla FrameworkElement.
Z góry dziękuje za twoją pomoc
Odpowiedzi:
1 dla odpowiedzi № 1Byłeś na dobrej drodze. Przede wszystkim musisz zmienić swój OnPositionChanged
metoda, aby dowiedzieć się, które wystąpienie miało swoje zachowanie Position
zmieniono:
private static void OnPositionChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
ScrollPositionBehavior behavior = d as ScrollPositionBehavior;
double value = (double)e.NewValue;
behavior.AssociatedObject.ScrollToVerticalOffset(value);
}
Wtedy dostaniesz ScrollViewer
jako obiekt powiązany, gdy dołączasz do niego zachowanie:
<ScrollViewer>
<i:Interaction.Behaviors>
<my:ScrollPositionBehavior Position="{what you need, e.g. Binding}" />
</i:Interaction.Behaviors>
</ScrollViewer>
Zauważ, że jeśli używasz Bindowania, może to być OneWay
wiązanie, ponieważ Position
nigdy nie zostanie zaktualizowany przez samo zachowanie.