2017-02-10 7 views
3
モバイル

では無視されます。スワイプは、ユーザーがコンボボックスから項目を選択したときに、私はプログラムでListViewコントロールを移入しています

コンテンツを変更する別の方法として、ユーザーが左右にスワイプできるようにすることで、アプリの使いやすさを向上させたいと考えています。

さらに正確に言えば、ユーザーがフリックまたは短いスワイプを実行すると、リストビューには別の項目が設定されます。操作が開始されたという視覚的な手がかりは必要ありません(つまり、ジェスチャを使用して前後にナビゲートするときにLike Edgeが行います)

以下は単純化されたXAML構造です。ここで

<Grid 
    x:Name="MainGrid" 
    ManipulationMode="TranslateX, TranslateInertia" 
    Loaded="MainGrid_Loaded"> 

    <ComboBox x:Name="CBMonthPicker" /> 

    <ListView 
     x:Name="LV" 
     ItemsSource="{Binding CalItems, ElementName=page}"     
     DataContext="MainPage"     
     IsItemClickEnabled="True" 
     ItemClick="OnItemClick" 
     ItemTemplateSelector="{StaticResource MyDataTemplateSelector}">   
    </ListView> 
</Grid> 

は、私は(Grid_ManipulationDeltaがモバイルにトリガされません)(私はマウスでスワイプをシミュレートする場合)デスクトップ上で動作スワイプを検出するために使用していますが、携帯電話では動作しないコードです:

private void MainGrid_Loaded(object sender, RoutedEventArgs e) 
    { 
     MainGrid.ManipulationDelta += Grid_ManipulationDelta; 
    } 

    private void Grid_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) 
    { 
     var swiped = e.Cumulative.Translation.X; 
     var swipeTriggerThreshhold = 300; 
     //if the gesture was not above a set threshold we ignore it 
     if (!e.IsInertial || swiped * swiped < swipeTriggerThreshhold * swipeTriggerThreshhold) 
      return;    
     //If we got so far, we registered a swipe 
     e.Complete(); //end manipulation so we only handle it once 
     if (swiped < 0) { //we swiped left 
      changeDisplayedMonth(-1); 
     } 
     else{ //we swiped right 
      changeDisplayedMonth(1); 
     }   
    } 

私の推測では、ListViewまたはListViewItemは何らかの形でグリッドからの操作を隠しています。

私はListViewとListViewItemを使って操作を処理しようとしましたが、ManipulationModeをTranslateX、TranslateInertiaに設定しても、ManipulationDeltaは決して起動されません。

スワイプに関してListViewItem(Outlookに掲載されているようなもの)に関する多くの質問があります。この質問はそれとは関係ありません。

コンテンツはユーザーの入力に基づいて動的に読み込まれるため、Pivo​​tを使用しないでください。たとえできたとしても、それは私のインターフェースに大きな変化をもたらすことになり、やはりやり直してしまいます。

+0

:あなたはオーバーレイリストビューを持っていますComboBoxとユーザーは両方と対話できますか?または彼らはお互いの下にいるのですか? – schumi1331

+0

コンボボックスとリストビューは同じグリッド(XAMLサンプルのMainGrid)を共有しますが、別々の行に配置されます。それらは重複しません。私がコンボボックスをスワイプすると、そのスワイプがモバイルで動作することに注目する価値があります。 – brett

答えて

0

完全に不満足な結果をもたらしたピボットの周りいじるの多くの後、私は私が欲しかった、まさに達成するためにハッキングのビットを使用することができFlipViewを発見しました。

トリックは、2つのダミーのFlipViewItemを追加します.1つはListViewを含む前に、もう1つは後に追加します。次のステップは、FlipViewのSelectionChangedイベントをキャプチャし、コンテンツが選択される前のFlipViewItemが、逆スワイプの場合と同じようにトリガします。コンテンツの後のFlipViewItemも同様です。 最後のステップは、コンテンツをListViewItemのコンテンツに強制的に戻すことです。

このようにFlipViewをハックしたときの小さな悩みは、FlipViewItem(私たちのコンテンツをホストしているもの)に選択を強制すると、エンドユーザーが期待するものとは逆のアニメーションになります。これはFlipViewでUseTouchAnimationsForAllNavigation = "False"というプロパティを設定することで簡単に修正できます。

ボーナス:ListViewの再作成中に実際に何かが起こっていることを示すために、私は進捗リングを追加しました。これを行うには、FlipViewとFlipViewItemとListViewのBackgroundプロパティをTransparentに設定することが重要です。 ListViewItemには、それをカバーするための指定された背景があります。これはProgressRingを実装するための完全に洗練されていない解決策ですが、うまくいきます。

だから、これが更新XAMLコードがどのように見えるかです:

<Grid x:Name="MainGrid" > 
    <ComboBox x:Name="CBMonthPicker" Grid.Row="0"/> 

    <ProgressRing Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" IsActive="True" /> 

    <FlipView x:Name="MainView" Grid.Row="1" 
       Loaded="MainView_Loaded" 
       UseTouchAnimationsForAllNavigation="False" 
       Background="Transparent"> 

     <FlipViewItem Background="Transparent">    
     </FlipViewItem> 

     <FlipViewItem Background="Transparent"> 
     <ListView x:Name="LV" 
      ItemsSource="{Binding CalItems, ElementName=page}" DataContext="MainPage"     
      IsItemClickEnabled="True" ItemClick="OnItemClick" 
      ItemTemplateSelector="{StaticResource MyDataTemplateSelector}">   
     </ListView> 
     </FlipViewItem> 

     <FlipViewItem Background="Transparent">    
     </FlipViewItem> 

</Grid> 

そしてこれは、コードの後ろにどのように見えるかです:ちょうどあなたのUIを理解するために

private void MainView_Loaded(object sender, RoutedEventArgs e) 
    { 
     MainView.SelectedIndex = 1; 
     MainView.SelectionChanged += MainView_SelectionChanged; 
    } 

    private void MainView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (MainView.SelectedIndex == 0) 
     { 
      //perform the action for Back Swipe Gesture 
      changeDisplayedMonth(-1); 

      //force selection back to our content FlipViewItem 
      MainView.SelectedIndex = 1;    
     } 
     if (MainView.SelectedIndex == 2) 
     { 
      //perform the action for Forward Swipe Gesture 
      changeDisplayedMonth(1); 

      //force selection back to our content FlipViewItem    
      MainView.SelectedIndex = 1;     
     }    
    } 
0

あなたの推測は正しいです - のListViewは、パフォーマンスを向上させ、非常に低いレベルに取り組んでいるScrollViewerのを、持っている、操作のしかし、その世話を最初ので、それは彼らを「ツバメ」。私は少し前に私がa similar questionに尋ねたようです。

このケースを手作業で処理する方法があります。Rob Caplan's blog postはそれを少し説明していますが、これはかなり古いものですが、少し明るいことがあります。またat this answerを見ることもできます。Windowsランタイムについては、UWPでも同様に動作するはずです。

も注意してください、あなたがやりたいことが容易であり得ること - あなたはのListViewでピボットまたは水平ScrollViewerので何かを置けば、あなたはのListViewのScrollViewerのへのプロパティIsHorizontalScrollChainingEnabledを変更することがありtrue、水平スクロールを親に渡します。ここではサンプルのXAMLコードです:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <ScrollViewer HorizontalScrollMode="Enabled" HorizontalScrollBarVisibility="Visible"> 
     <StackPanel Orientation="Horizontal"> 
      <ListView Width="200" Height="100" ScrollViewer.IsHorizontalScrollChainingEnabled="True"> 
       <x:String>First Item</x:String> 
       <x:String>Item</x:String> 
       <x:String>Item</x:String> 
       <x:String>Item</x:String> 
       <x:String>Last Item</x:String> 
      </ListView> 
      <Rectangle Width="200" Height="100" Fill="Red"/> 
      <Rectangle Width="200" Height="100" Fill="Green"/> 
      <Rectangle Width="200" Height="100" Fill="Blue"/> 
     </StackPanel> 
    </ScrollViewer> 
</Grid> 
+0

私が正しく理解していれば、スワイプジェスチャーをキャプチャして処理する間に、リストビューのために垂直スクロールを手動で実装することです。私が他の質問にあなたの答えから読んだことは、スクロールの滑らかさがこの操作中に失われるということです。この場合、私はむしろそのルートを持っていないだろう。また、水平スクロールコンテナでリストビューをラップするあなたの他の提案は機能しませんでした。 ManipulationDeltaイベントは(コンテナとリストビュー自体のいずれかで)トリガされることはないだけでなく、そのときレイアウトが大きく壊れます。 – brett

+0

@brett私は最終的に何を達成しようとしているのか分かりません。 xamlサンプルのようなスクロールチェーンを使用している場合は、ManiplationDeltaは必要ありません。新鮮なアプリケーションでこのコードを試してみましたか?さらに、スクロールに関するロジックがさらに必要な場合は、水平スクロールビューアのイベントを常に購読することができます。 – Romasz

+0

希望の結果を明確にするために質問を更新しました。私はアプリのどこにでも水平スクロールがありません。垂直のみ。 – brett

関連する問題