积极答复者
FlowDocumentScrollViewer中的上下滚动Scroll反应不到根级的ScrollViewer中?

问题
-
Page根级是一个ScrollViewer
然后内部许多布局空间,整体如同一个网页
其中右侧当中主要区域显示一篇文章
现在要求文章部分不显示滚动条 做了如下设置
VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Disabled"
呈现出来的确是文章部分不显示滚动条 最外侧的滚动条呈现出来
但是问题是鼠标若落在了FlowDocumentScrollViewer中 滚轮就会失效 不能滚动最外侧的ScrollViewer
除非将鼠标移至别的元素上 才能上下滚动 这是怎么一回事?
答案
-
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
- 已标记为答案 Jie BaoModerator 2012年2月21日 6:22
-
很不错 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);
}
- 已编辑 aze 2012年2月21日 6:03
- 已建议为答案 Jie BaoModerator 2012年2月21日 6:22
- 已标记为答案 Jie BaoModerator 2012年2月21日 6:22
全部回复
-
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
- 已标记为答案 Jie BaoModerator 2012年2月21日 6:22
-
很不错 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);
}
- 已编辑 aze 2012年2月21日 6:03
- 已建议为答案 Jie BaoModerator 2012年2月21日 6:22
- 已标记为答案 Jie BaoModerator 2012年2月21日 6:22