
>我试图在控制面板中更改鼠标的滚动设置,但这没有任何效果.我认为WPF忽略了FlowdocumentScrollVIEwer的设置.
>我在Flowdocument和flowdocumentreader上添加了一个Scroll事件,但是当我使用鼠标滚轮时,它不会触发.
>我在flowdocumentreader上添加了一个Loaded事件,得到了ScrollVIEwer后代,
从滚动查看器的模板中找到了Scrollbar(“PART_VerticalScrollbar”)并调整了SmallChange& LargeChange属性.这也没有任何影响.
有人有主意吗?
解决方法 我们可以在Control的MouseWheel事件中修改它,比如Sohnee sugested,但是它只是针对一个特定的情况解决了,你必须能够访问flowdocumentreader,如果你使用类似MVVM的东西,你就不会.相反,我们可以创建一个附加属性,然后我们可以使用ScrollVIEwer在任何元素上设置它.在定义附加属性时,我们还需要一个PropertyChanged回调函数,我们将对滚动速度执行实际修改.我还给了我的属性一个默认值1,我将要使用的速度范围是.1x到3x,尽管你可以轻松地做1-10之类的事情.public static double GetScrollSpeed(DependencyObject obj){ return (double)obj.GetValue(ScrollSpeedProperty);}public static voID SetScrollSpeed(DependencyObject obj,double value){ obj.SetValue(ScrollSpeedProperty,value);}public static Readonly DependencyProperty ScrollSpeedProperty = DependencyProperty.Registerattached( "ScrollSpeed",typeof(double),typeof(ScrollHelper),new FrameworkPropertyMetadata( 1.0,FrameworkPropertyMetadataOptions.inherits & FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,new PropertyChangedCallback(OnScrollSpeedChanged)));private static voID OnScrollSpeedChanged(DependencyObject o,DependencyPropertyChangedEventArgs e){} 现在我们有了附加属性,我们需要处理滚动,为此,在OnScrollSpeedChanged中我们可以处理PrevIEwMouseWheel事件.我们想要挂钩到PrevIEwMouseWheel,因为它是在ScrollVIEwer可以处理标准MouseWheel事件之前发生的隧道事件.
目前,PrevIEwMouseWheel处理程序正在接收flowdocumentreader或我们绑定它的其他东西,但我们需要的是ScrollVIEwer.因为它可能是很多东西:ListBox,flowdocumentreader,WPF Toolkit GrID,ScrollVIEwer等,我们可以创建一个使用VisualTreeHelper执行此 *** 作的简短方法.我们已经知道通过的项目将是某种形式的DependancyObject,因此我们可以使用一些递归来查找ScrollVIEwer(如果存在).
public static DependencyObject GetScrollVIEwer(DependencyObject o){ // Return the DependencyObject if it is a ScrollVIEwer 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; } else { return result; } } return null;}private static voID OnScrollSpeedChanged(DependencyObject o,DependencyPropertyChangedEventArgs e){ var host = o as UIElement; host.PrevIEwMouseWheel += new MouseWheelEventHandler(OnPrevIEwMouseWheelScrolled);} 现在我们可以获得ScrollViwer,我们最终可以修改滚动速度.我们需要从正在发送的DependancyObject中获取ScrollSpeed属性.此外,我们可以使用我们的辅助方法来获取元素中包含的ScrollVIEwer.一旦我们有了这两件事,我们就可以获得并修改ScrollVIEwer的VerticalOffset.我发现将MouseWheelEventArgs.Delta(鼠标滚轮改变的数量)除以6得到大约默认的滚动速度.因此,如果我们将它乘以ScrollSpeed修改器,我们就可以得到新的偏移值.然后我们可以使用它公开的ScrollToVerticalOffset方法设置ScrollVIEwer的VerticalOffset.
private static voID OnPrevIEwMouseWheelScrolled(object sender,MouseWheelEventArgs e){ DependencyObject scrollHost = sender as DependencyObject; double scrollSpeed = (double)(scrollHost).GetValue(Demo.ScrollSpeedProperty); ScrollVIEwer scrollVIEwer = GetScrollVIEwer(scrollHost) as ScrollVIEwer; if (scrollVIEwer != null) { double offset = scrollVIEwer.VerticalOffset - (e.Delta * scrollSpeed / 6); if (offset < 0) { scrollVIEwer.ScrollToVerticalOffset(0); } else if (offset > scrollVIEwer.ExtentHeight) { scrollVIEwer.ScrollToVerticalOffset(scrollVIEwer.ExtentHeight); } else { scrollVIEwer.ScrollToVerticalOffset(offset); } e.Handled = true; } else { throw new NotSupportedException("ScrollSpeed Attached Property is not attached to an element containing a ScrollVIEwer."); }} 现在我们已经设置了Attached Property,我们可以创建一个简单的UI来演示它.我将创建一个ListBox和一个flowdocumentreaders,以便我们可以看到ScrollSpeed如何在多个控件中受到影响.
<UniformGrID Columns="2"> <DockPanel> <SlIDer DockPanel.Dock="top" Minimum=".1" Maximum="3" SmallChange=".1" Value="{Binding Elementname=uiListBox,Path=(ScrollHelper:Demo.ScrollSpeed)}" /> <ListBox x:name="uiListBox"> <!-- Items --> </ListBox> </DockPanel> <DockPanel> <SlIDer DockPanel.Dock="top" Minimum=".1" Maximum="3" SmallChange=".1" Value="{Binding Elementname=uiListBox,Path=(ScrollHelper:Demo.ScrollSpeed)}" /> <flowdocumentreader x:name="uiReader" VIEwingMode="Scroll"> <!-- Flow document Content --> </flowdocumentreader> </DockPanel></UniformGrID> 现在,在运行时,我们可以使用滑块修改每个列中的滚动速度,有趣的东西.
总结以上是内存溢出为你收集整理的c# – 当ViewingMode设置为滚动时调整FlowDocumentReader的滚动增量?全部内容,希望文章能够帮你解决c# – 当ViewingMode设置为滚动时调整FlowDocumentReader的滚动增量?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)