1

「AniScrollViewer」という名前のクラスを作成しました。垂直スクロール オフセット
を設定して、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」をリストボックスにプッシュしたい

私はいくつかの問題を抱えています:

  • Listbox クラスには既に「scrollviewer」が含まれています。
    デフォルトのリストボックス スクロール ビューアーをカスタム AniScrollViewerに置き換えたいのですが、その方法がわかりません。
  • Listbox コード ビハインドで ScrollViewer を取得したい。このような:

Listbox listbox (これは既に XAML で定義されています)
AniScrollViewer scrollviewer = listbox.~~~~;

助けてください。

4

1 に答える 1

1
  • デフォルトをカスタムのものに置き換えるにはScrollViewer、 のカスタムを定義Styleし、デフォルトを自分のものListBoxControlTemplate切り替えます( )。これを使用すると、. デフォルトであり、ここで見つけることができますScrollViewerlocal:AniScrollViewerListBoxStyleScrollViewerControlTemplateStyle
  • ScrollViewerコード ビハインドでを取得するには、これを参照として使用できます。関数では

GetScrollViewer(DependencyObject o)

ScrollViewer次のようなカスタムでタイプセーフであることを確認してください

if (o is AniScrollViewer)
  return o;

代わりの

ただし、あなたの場合、これをサブクラス化することを選択した理由がわかりませんScrollViewer。独自の を定義する面倒な代わりにListBox ControlTemplate、添付プロパティを使用してみてください。何かのようなもの:

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このように、 customとそれに伴うすべてのオーバーヘッドを定義する必要はありません。

于 2013-06-03T08:11:08.313 に答える