【问题标题】:WPF overriding ScrollVIewer in ListboxWPF 覆盖列表框中的 ScrollVIewer
【发布时间】:2013-06-03 02:38:28
【问题描述】:

我做了一个名为“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。像这样:

列表框列表框(已在 XAML 中定义)
AniScrollViewer scrollviewer = listbox.~~~~;

请帮忙。

【问题讨论】:

    标签: c# wpf class overriding scrollview


    【解决方案1】:
    • 要将默认ScrollViewer 替换为自定义@,请为ListBox 定义自定义Style,并在ControlTemplate 中将默认ScrollViewer 替换为您的local:AniScrollViewer。现在任何使用此StyleListBox 都将拥有您的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 以及随之而来的所有开销。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 2011-01-23
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多