2014-09-04 30 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