none
FlowDocumentScrollViewer中的上下滚动Scroll反应不到根级的ScrollViewer中? RRS feed

  • 问题

  • Page根级是一个ScrollViewer

    然后内部许多布局空间,整体如同一个网页

    其中右侧当中主要区域显示一篇文章

    现在要求文章部分不显示滚动条 做了如下设置

    VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Disabled"

    呈现出来的确是文章部分不显示滚动条 最外侧的滚动条呈现出来

    但是问题是鼠标若落在了FlowDocumentScrollViewer中 滚轮就会失效 不能滚动最外侧的ScrollViewer

    除非将鼠标移至别的元素上 才能上下滚动 这是怎么一回事?

    2012年2月20日 6:32

答案

  • FlowDocumentScrollViewer 中处理滚轮事件将e.Handled设为True了,此事件无法被路由到外层。

    所以我们只要手动地将外面的ScrollViewer滚动就可以了,例如:

      <ScrollViewer x:Name="scrollViewer">
        <FlowDocumentScrollViewer
          PreviewMouseWheel="FlowDocumentScrollViewer_PreviewMouseWheel"
          VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Disabled">
          <FlowDocument>
            <Paragraph>
              <Run>Hello wpf!</Run>
            </Paragraph>
            ......
          </FlowDocument>
        </FlowDocumentScrollViewer>
      </ScrollViewer>

    C#:

        private void FlowDocumentScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
          if (e.Delta > 0)
            scrollViewer.LineUp();
          else
            scrollViewer.LineDown();
          e.Handled = true;
        }

    Sincerely,

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年2月20日 8:38
    版主
  • 很不错  thanks 只是那个偏移量似乎不一致 小了 找到这个方法

    ScrollViewer_Root.ScrollToVerticalOffset(ScrollViewer_Root.VerticalOffset - (double)e.Delta);
    e.Handled = true;

    另外又找个其他解决办法

    if (sender is FlowDocumentScrollViewer && !e.Handled)
    {
        e.Handled = true;
        var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
        eventArg.RoutedEvent = UIElement.MouseWheelEvent;
        eventArg.Source = sender;
        ScrollViewer_Root.RaiseEvent(eventArg);
    }




    2012年2月21日 6:01

全部回复

  • FlowDocumentScrollViewer 中处理滚轮事件将e.Handled设为True了,此事件无法被路由到外层。

    所以我们只要手动地将外面的ScrollViewer滚动就可以了,例如:

      <ScrollViewer x:Name="scrollViewer">
        <FlowDocumentScrollViewer
          PreviewMouseWheel="FlowDocumentScrollViewer_PreviewMouseWheel"
          VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Disabled">
          <FlowDocument>
            <Paragraph>
              <Run>Hello wpf!</Run>
            </Paragraph>
            ......
          </FlowDocument>
        </FlowDocumentScrollViewer>
      </ScrollViewer>

    C#:

        private void FlowDocumentScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
          if (e.Delta > 0)
            scrollViewer.LineUp();
          else
            scrollViewer.LineDown();
          e.Handled = true;
        }

    Sincerely,

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年2月20日 8:38
    版主
  • 很不错  thanks 只是那个偏移量似乎不一致 小了 找到这个方法

    ScrollViewer_Root.ScrollToVerticalOffset(ScrollViewer_Root.VerticalOffset - (double)e.Delta);
    e.Handled = true;

    另外又找个其他解决办法

    if (sender is FlowDocumentScrollViewer && !e.Handled)
    {
        e.Handled = true;
        var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
        eventArg.RoutedEvent = UIElement.MouseWheelEvent;
        eventArg.Source = sender;
        ScrollViewer_Root.RaiseEvent(eventArg);
    }




    2012年2月21日 6:01