2013-06-03 69 views
1

我創建了一個名爲「AniScrollViewer」的類,它可以設置垂直滾動偏移量
來爲滾動查看器代碼隱藏設置動畫。
WPF重寫列表框中的ScrollVIewer

public class AniScrollViewer : ScrollViewer { 
    public static readonly DependencyProperty CurrentVerticalOffsetProperty = 
     DependencyProperty.Register("CurrentVerticalOffset", typeof(double), typeof(AniScrollViewer), 
     new PropertyMetadata(new PropertyChangedCallback(OnVerticalChanged))); 

    public double CurrentVerticalOffset { 
     get { return (double)GetValue(CurrentVerticalOffsetProperty); } 
     set { SetValue(CurrentVerticalOffsetProperty, value); } 
    } 

    private static void OnVerticalChanged(DependencyObject property, DependencyPropertyChangedEventArgs e) { 
     AniScrollViewer viewer = property as AniScrollViewer; 
     viewer.ScrollToVerticalOffset((double)e.NewValue); 
    } 
} 

我想這個 'AniScrollViewer' 推到一個列表框

我遇到兩個問題:

  • 列表框類已擁有 '的ScrollViewer' 內。我想用我的自定義AniScrollViewer替換
    默認列表框滾動查看器,但我不知道如何執行此操作。
  • 我想在Listbox代碼隱藏中獲得ScrollViewer。像這樣:

列表框列表框(這已經在definded XAML)
AniScrollViewer的ScrollViewer =列表框~~~~。

請幫忙。

回答

1
  • 要使用自定義一個替換默認ScrollViewer,定義自定義StyleListBox並在ControlTemplate開關從默認ScrollViewer與一個(local:AniScrollViewer)。現在任何ListBox使用這個Style將有你的ScrollViewer。默認ControlTemplateStyle可以發現Here
  • 要在代碼隱藏中獲得ScrollViewer,可以使用this作爲參考。在功能

GetScrollViewer(DependencyObject o)

檢查它是類型安全的與您的自定義ScrollViewer

if (o is AniScrollViewer) 
    return o; 

備用

不過你的情況,我不知道爲什麼你的爲此選擇ScrollViewer的子類。可以嘗試使用附加屬性,而不是定義自己的ListBoxControlTemplate這種麻煩。喜歡的東西:

public class ScrollAnimator { 
    public static readonly DependencyProperty ScrollToProperty = 
    DependencyProperty.RegisterAttached(
     "ScrollTo", 
     typeof(double), 
     typeof(ScrollAnimator), 
     new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.None, ScrollToChangedCallback)); 

    private static void ScrollToChangedCallback(
    DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) { 
    ScrollViewer viewer = GetScrollViewer(dependencyObject) as ScrollViewer; 
    if (viewer != null) 
     viewer.ScrollToVerticalOffset((double)dependencyPropertyChangedEventArgs.NewValue); 

    // Modify Above code to however you want to do the animation. 
    } 

    public static DependencyObject GetScrollViewer(DependencyObject o) { 
    if (o is ScrollViewer) 
     return o; 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++) { 
     var child = VisualTreeHelper.GetChild(o, i); 
     var result = GetScrollViewer(child); 
     if (result == null) 
     continue; 
     return result; 
    } 
    return null; 
    } 

    public static void SetScrollTo(UIElement element, Orientation value) { 
    element.SetValue(ScrollToProperty, value); 
    } 

    public static Orientation GetScrollTo(UIElement element) { 
    return (Orientation)element.GetValue(ScrollToProperty); 
    } 
} 

與用法:

<ListBox ItemsSource="{Binding Items}" 
     local:ScrollAnimator.ScrollTo="{Binding ScrollTo}" /> 

這樣,您就沒有必要定義自定義ControlTemplate的所有隨之而來的開銷。