繁体   English   中英

WPF覆盖列表框中的ScrollVIewer

[英]WPF overriding ScrollVIewer in Listbox

我制作了一个名为“ 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”。 我要更换
    默认的列表框scrollviewer和我的自定义AniScrollViewer,但是我不知道该怎么做。
  • 我想在代码隐藏列表框中获取ScrollViewer。 像这样:

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

请帮忙。

  • 要将默认的ScrollViewer替换为自定义Style ,请为ListBox定义自定义Style ,然后在ControlTemplate使用您的默认ScrollViewerlocal:AniScrollViewer )切换出来。 现在,任何使用此Style ListBox都将具有ScrollViewer 默认的ControlTemplateStyle可以在这里找到
  • 要在后面的代码中获取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及其附带的所有开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM