2014-09-04 56 views
3

我有一些问题试图找出如何滚动包含在滚动查看器内的网格的内容。当尝试使用鼠标滚轮或平移键盘(使用触摸屏)进行滚动时,如果鼠标/触摸点位于空白区域上,网格滚动会很好,但如果它位于特定控件(例如组框)上方,滚动。是否有一些属性我错过了允许子面板允许他们滚动父容器?WPF通过子容器滚动父容器

编辑: 我错误地说我的原始布局。这里是我的塞纳里奥的简化版本:

<Grid> 
    <ScrollViewer Name="MainScrollViewer"> 
     <StackPanel> 
      <ListBox /> <--Doesn't Scroll--> 
      <Button />  <--Scrolls Fine--> 
      <TextBlock /> <--Scrolls Fine--> 
      <TextBox /> <--Scrolls Fine--> 
      <DataGrid /> <--Doesn't Scroll--> 
     </StackPanel> 
    </ScrollViewer> 
</Grid> 

的同事,指出我的问题是由于这样的事实,如列表框和DataGrid中的控件包含ScrollViewers自己,这是有道理的。他的建议(这将起作用,但我们双方都同意似乎比应该更复杂)是在后面的代码中捕捉并重新抛出滚动事件(并且可能必须处理计算滚动的偏移量),以便它可以冒泡到“MainScrollViewer”。

编辑2: 这似乎是实现这一目标的唯一方法是使用后面的代码来处理父代中的PreviewMouseWheel事件。这是有效的,但我该如何去执行相同的平移操作(通过手指在触摸屏上滚动)?

+0

你知道网格包含它是一个'ScrollViewer'吗?没有必要把它放在ScrollViewer中。 。 。如果您安装了VS2013,您可以在C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Blend \ SystemThemes \ Wpf – 2014-09-04 20:20:08

+0

中找到VS中随附的每个控件都使用的模板当您说'grid'时,你指的是“Grid”面板还是数据网格控件? – 2014-09-04 20:21:05

+0

此外,如果控件的“背景”是“透明”,则命中测试失败。将“背景”更改为其他颜色和测试。 – 2014-09-04 20:21:24

回答

4

使用的ScrollViewer的PreviewMouseWheel事件和ScrollToVerticalOffset方法...

private void ScrollViewerOnPreviewMouseWheel(object sender, MouseWheelEventArgs e) 
{ 
    var scv = sender as ScrollViewer; 
    if (scv == null) return; 
    scv.ScrollToVerticalOffset(scv.VerticalOffset - e.Delta); 
    e.Handled = true; 
} 
+1

是的,这或多或少是我和我的同事讨论过的。如果没有其他方法,那么我将使用这种方法,但似乎应该有一个更简单的方法,最好不涉及后面的代码......在我上面的示例中,StackPanel和它的内容实际上是一个单独的用户控制,所以我不得不将这些代码插入到所有正在调用的父母身上,似乎有人会忘记这样做,并遇到我目前遇到的相同问题。 – AXG1010 2014-09-05 18:15:46

+0

原来的答案:https://stackoverflow.com/a/16110178/5035500 – 2017-06-23 11:15:45

0

对于初学者,请确保您使用的是已存在的技术。这可能会解决您的问题。

<Grid HorizontalAlignment="Left" Height="300" Margin="10,10,0,0" VerticalAlignment="Top" Width="497" ScrollViewer.VerticalScrollBarVisibility="Visible" /> 

但如果不解决这个问题,我知道这听起来很奇怪,设置网格和问题对象的背景颜色为#00000000。 (如果它还没有分配颜色/笔刷)

<Grid HorizontalAlignment="Left" Height="300" Margin="10,10,0,0" VerticalAlignment="Top" Width="497" Background="#00000000"/> 

我知道它很奇怪,但是当我遇到这些问题时,它每次都有效。我不知道它为什么起作用。与透明度有关。

3

为您滚动视图中创建一个冒泡scrollbehavior:

using System.Windows; 
using System.Windows.Input; 
using System.Windows.Interactivity; 

public sealed class BubbleScrollEvent : Behavior<UIElement> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.PreviewMouseWheel += AssociatedObject_PreviewMouseWheel; 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.PreviewMouseWheel -= AssociatedObject_PreviewMouseWheel; 
     base.OnDetaching(); 
    } 

    void AssociatedObject_PreviewMouseWheel(object sender, MouseWheelEventArgs e) 
    { 
     if (!e.Handled) 
     { 
      e.Handled = true; 
      var e2 = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta) { RoutedEvent = UIElement.MouseWheelEvent }; 
      AssociatedObject.RaiseEvent(e2); 
     } 
    } 
} 

添加这种行为您的ScrollViewer:

<ScrollViewer x:Name="Scroller"> 
        <i:Interaction.Behaviors> 
         <ViewAddons:BubbleScrollEvent /> 
        </i:Interaction.Behaviors> 
+2

这绝对是一个更清晰的方法比一个明显的答案。更可重用。 – Chandan 2017-01-17 15:50:27

+0

将此行为附加到外部ScrollViewer的工作方式与预期的相同。这应该是接受的答案恕我直言。 – 2017-02-07 14:20:47

+0

原创答案:https://stackoverflow.com/a/15904265/5035500 – 2017-07-04 11:14:43