![](/img/trans.png)
[英]WPF - Main ScrollViewer should not disable scrollviewer of listbox in usercontrol
[英]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”推入列表框
我遇到几个问题:
列表框列表框(已在XAML中定义)
AniScrollViewer scrollviewer =列表框。~~~~;
请帮忙。
ScrollViewer
替换为自定义Style
,请为ListBox
定义自定义Style
,然后在ControlTemplate
使用您的默认ScrollViewer
( local:AniScrollViewer
)切换出来。 现在,任何使用此Style
ListBox
都将具有ScrollViewer
。 默认的ControlTemplate
和Style
可以在这里找到 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.