2011-08-08 22 views
2

私の勝利の電話7アプリでは、リストボックスで垂直スクロールを無効にしたいと考えています。しかし、私が使用するときスクロールを無効にするとスクロール位置を保持する方法

listbox.SetValue(ScrollViewer.VerticalScrollBarVisibilityProperty, ScrollBarVisibility.Disabled); 

リストボックスが一番上にスクロールします。スクロールを無効にしているときにスクロール位置を保持するにはどうすればよいですか?

編集:私はリストボックスがそれらを処理する前にイベントを飲み込むことによってスクロールを無効にすることを考えています。しかし、私がManipulationStartedとManipulationCompletedを処理しようとすると、例外があります。リストボックスにスクロールできないイベントは何ですか?

at Microsoft.Phone.Gestures.GestureHelper.ReleaseMouseCaptureAtGestureOrigin() 
     at Microsoft.Phone.Gestures.GestureHelper.NotifyMove(InputDeltaArgs args) 
     at Microsoft.Phone.Gestures.ManipulationGestureHelper.Target_ManipulationDelta(Object sender, ManipulationDeltaEventArgs e) 
     at System.Windows.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args) 
     at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName) 
     at Microsoft.Xna.Framework.Input.UnsafeNativeMethods.CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam) 
     at Microsoft.Xna.Framework.Input.SafeNativeMethods.CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam) 
     at Microsoft.Xna.Framework.Input.WindowMessageHooker.Hook.WndProc(IntPtr msgWnd, UInt32 msg, IntPtr wParam, IntPtr lParam) 

編集:私のコードで処理として、私はManipulationStarted、ManipulationDeltaとManipulationCompletedをマークすると は、私はこのスタックトレースとヌル例外を持っている私は、私は無効にスクロールをしたいと、デフォルトのリストボックスが動作することを発見しました。しかし、私のリストボックスには、UI仮想化を無効にするItemPresenterを持つスタックを持つカスタムテンプレートがあります。このシナリオでは、スクロールを無効にすると、リストボックスが自動的に上にスクロールします。

編集:ここでは、リストボックスのテンプレートです:

<phone:PhoneApplicationPage.Resources> 
     <Style x:Key="ListBoxStyle1" TargetType="ListBox"> 
      <Setter Property="Background" Value="Transparent"/> 
      <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/> 
      <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/> 
      <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> 
      <Setter Property="BorderThickness" Value="0"/> 
      <Setter Property="BorderBrush" Value="Transparent"/> 
      <Setter Property="Padding" Value="0"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ListBox"> 
         <ScrollViewer x:Name="ScrollViewer" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" Padding="{TemplateBinding Padding}"> 
          <StackPanel Orientation="Vertical" Width="468"> 
           <ItemsPresenter d:LayoutOverrides="Width"/> 
          </StackPanel> 
         </ScrollViewer> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </phone:PhoneApplicationPage.Resources> 

およびXAML:のGotFocusとLOSTFOCUS機能で

<ListBox x:Name="MainListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}" SelectionChanged="MainListBox_SelectionChanged" Style="{StaticResource ListBoxStyle1}" GotFocus="gotfocus" LostFocus="lostfocus"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Margin="0,0,0,17" Width="432"> 
          <TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/> 
          <TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/> 
         </StackPanel> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

、私は無効にして、それぞれのスクロール可能。このリストボックスは、デフォルトのデータバインドされたアプリケーションからのものです。下にスクロールして1つの項目をクリックすると、リストボックスが上にスクロールします。 ItemPresenterを保持するためにスタックを使用していないときは発生しません。

+0

リストボックスのXAMLを表示できますか? – keyboardP

+0

はい、私は質問を更新しました=) –

答えて

0

あなたはこれを行うことができます。

ScrollViewer.SetVerticalScrollBarVisibility(listbox, ScrollBarVisibility.Disabled); 
+0

ありがとうが、これはまだリストボックスを上にスクロールさせます。私はスクロールを無効にした後にスクロール位置を保持したい。 –

+0

私はそれを試しました、そして、それは私のためにうまくいくようです。コードを投稿できますか? – keyboardP

+0

こんにちはkeyboardP、そうです、デフォルトのリストボックスは正常に動作しますが、私はカスタムテンプレートでリストボックスを持っています。私の更新された質問を参照してください:-) –

0

あなたはそれ以外の場合はスクロールを無効にするにはfalseにIsHitTestVisibleプロパティを設定することができませんか?

+0

リスト項目と対話する必要があるので、 –

0

私は、カスタムテンプレートのリストボックスで作業している小さなプロジェクトを持っています。私は次のコードをテストし、それは私のためにうまくいくようだ:

ScrollViewer.SetVerticalScrollBarVisibility(YourListBox, ScrollBarVisibility.Disabled); 
YourListBox.ScrollIntoView(YourListBox.SelectedItem); 
関連する問題