2010-07-15 58 views
3

WPF 4.0:多點觸控的ScrollViewer吃觸摸事件

我已經滾動查看器,它裏面很多滑塊。我希望滾動查看器可以平移觸摸,並且我希望內部滑塊也能夠響應觸摸。

不幸的是,滾動查看器正在吃掉「TouchMove」事件,而不是將它們傳遞給滑塊控件。任何想法如何解決這個問題?

這是我的XAML:

<Window x:Class="ScrollingTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ItemsControl ItemsSource="{Binding}"> 
      <ItemsControl.Template> 
       <ControlTemplate> 
        <ScrollViewer VerticalScrollBarVisibility="Auto" PanningMode="Both" > 
         <ItemsPresenter /> 
        </ScrollViewer> 
       </ControlTemplate> 
      </ItemsControl.Template> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Border Height="100" BorderThickness="2" BorderBrush="Black"> 
         <Slider Value="{Binding ., Mode=TwoWay}" Width="300" Minimum="0" Maximum="100" /> 
        </Border> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Grid> 
</Window> 

我的代碼隱藏:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = Items; 
    } 

    public IEnumerable<int> Items 
    { 
     get 
     { 
      return Enumerable.Range(0, 50); 
     } 
    } 
} 

回答

0

這聽起來像 「標記爲處理路由事件」 的情況。你可以嘗試使用AddHandler來訂閱該事件,並將最後一個參數「handledEventsToo」設置爲true?

乾杯, 洛朗

+0

好的建議,洛朗。我嘗試過,但我仍然沒有得到TouchMove事件。我已經嘗試覆蓋OnTouchMove以及...但它從來沒有設置「處理」爲真正的基地... blerg。 – 2010-07-15 19:10:39

+0

我是新的觸摸手勢的東西;一旦您有TouchDown事件,您是否需要註冊一個事件處理程序?或者系統是否依靠某些硬件來觸發您可能沒有的TouchMove? 只是猜測。 – 2010-07-15 21:23:22

+0

當滑塊不在滾動查看器中時,一切正常,因爲觸摸事件轉換爲鼠標事件。我甚至可以在沒有滾動查看器的情況下獲得TouchMove事件。但是,一旦滾動查看器接管,它不會讓TouchMove事件停機,所以它永遠不會有機會作爲鼠標移動來翻譯。 – 2010-07-15 22:07:30

0

它處理的TouchMove事件,最有可能的。 Bubider事件(PreviewTouchMove等)可以在Slider控件中處理。您需要協調您希望如何處理觸摸事件。

+0

據我所知,對於PreviewTouchMove或TouchMove,「處理」標誌永遠不會設置爲True。儘管如此,這些事件從來沒有下到滑塊。 TouchDown DOES,但是,它會降低。發生這種情況時我試過CaptureTouch ......但仍然沒有運氣:( – 2010-07-15 19:17:34

0

您可以嘗試使您的自定義類,從ScrollViewer派生並重寫OnTouchMove方法。

public class CustomScrollViewer : System.Windows.Controls.ScrollViewer 
{ 
    protected override void OnTouchMove(System.Windows.Input.TouchEventArgs e) 
    { 
     // delete the base.OnTouchMove() call to prevent event being "eat" :) 
    } 
} 

然後,您編輯XAML這樣的:

<Window x:Class="ScrollingTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ItemsControl ItemsSource="{Binding}"> 
      <ItemsControl.Template> 
       <ControlTemplate> 
        <local:CustomScrollViewer VerticalScrollBarVisibility="Auto" PanningMode="Both" > 
         <ItemsPresenter /> 
        </local:CustomScrollViewer> 
       </ControlTemplate> 
      </ItemsControl.Template> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Border Height="100" BorderThickness="2" BorderBrush="Black"> 
         <Slider Value="{Binding ., Mode=TwoWay}" Width="300" Minimum="0" Maximum="100" /> 
        </Border> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Grid> 
</Window>