c# – 当ViewingMode设置为滚动时调整FlowDocumentReader的滚动增量?

c# – 当ViewingMode设置为滚动时调整FlowDocumentReader的滚动增量?,第1张

概述我在FlowDocumentReader中使用ViewingMode =“Scroll”显示FlowDocument.如果我在鼠标上使用滚轮,则文档滚动速度非常慢.我想增加滚动步骤. >我试图在控制面板中更改鼠标的滚动设置,但这没有任何效果.我认为WPF忽略了FlowDocumentScrollViewer的设置. >我在FlowDocument和FlowDocumentReader上添加了一个S 我在flowdocumentreader中使用VIEwingMode =“Scroll”显示Flowdocument.如果我在鼠标上使用滚轮,则文档滚动速度非常慢.我想增加滚动步骤.

>我试图在控制面板中更改鼠标的滚动设置,但这没有任何效果.我认为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的滚动增量?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1240951.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存