2016-03-09 30 views
0

我想讓用戶在包含ListView的控件上滑動。 下面是示例代碼:對ListView的父對象的操作

<Border ManipulationMode="All" 
     ManipulationDelta="UIElement_OnManipulationDelta"> 
    <ListView> 
     <ListView.Items> 
      <x:Int32>1</x:Int32> 
      <x:Int32>1</x:Int32> 
      <x:Int32>1</x:Int32> 
      <x:Int32>1</x:Int32> 
      <x:Int32>1</x:Int32> 
      <x:Int32>1</x:Int32> 
      <x:Int32>1</x:Int32> 
     </ListView.Items> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <Grid Width="200" Height="50"/> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
</Border> 

出於某種原因,在ManipulationDelta事件是不是養了電話。我該如何解決這個問題?

+0

測試過您的代碼,只有在移動模擬器或模擬器或手機上進行測試時,纔會發生此問題,而不是在PC或本地計算機上進行測試。我對嗎? –

+0

@ GraceFeng-MSFT是的。 – acedened

回答

1

開始的時候我想說,如果有對ListView沒有Margin或在Border沒有Padding,並有兩個元素沒有這樣的尺寸限制,ListView在這種情況下,將填補整個邊界首先默認捕獲所有事件。

但是UIElement.ManipulationDelta event是路由事件。當你在它上面滑動時,ListView會捕獲它,同時你沒有在ListView上處理這個事件,所以這個事件會冒泡到父元素,因爲它沒有處理,那麼作爲父元素的你的Border可以處理這個事件。這就是爲什麼在ListView父項上的操作可以在PC上被觸發的原因。

但爲什麼它不能在手機模擬器上被解僱?正如我所說,這個輕掃手勢首先被ListView捕獲,而ListView控件包含其中的ScrollViewer,這個ScrollViewer將處理您在手機模擬器上滾動的輕掃手勢,然後不會ListView將此事件再次傳遞給它的父項在PC上。

PC和模擬器上這個事件的區別在於,操作事件可以響應鼠標設備,但不是單指觸摸。你可以參考ListView ManipulationCompleted event doesn't work on phone

如何解決這個問題?一個非常簡單的方法是,您可以在BorderListView之間留出一些空間,如<ListView Margin="50">,然後您可以在模擬器上的ListView之外捕獲此事件,但這會破壞您的原始UI設計。另一個解決方法就像我說的那樣,你可以使用Pointer事件。剛剛測試過,當這些事件在ListView的父母身上時,仍然可以在模擬器上被觸發。