2011-08-08 79 views
2

在我的win phone 7应用程序中,我想禁用列表框中的垂直滚动。但是当我用如何在禁用滚动时保留滚动位置

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

列表框滚动到顶部。如何禁用滚动时保留滚动位置?

编辑:我想通过吞噬事件在列表框处理它们之前禁用滚动。但是当我尝试处理ManipulationStarted和ManipulationCompleted时,我有例外。我应该处理哪些事件以使列表框不能滚动? 当我将在ManipulationStarted,在ManipulationDelta并在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) 

编辑:我发现默认列表框的作品,因为我想,当禁用滚动。但是我的列表框有一个带有ItemPresenter的堆栈的自定义模板来禁用UI虚拟化。在这种情况下,禁用滚动时,列表框自动滚动到顶部。

编辑:这里是ListBox的模板:

<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:

<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> 

在的GotFocus和LostFocus功能,我禁用和启用滚动分别。该列表框来自默认的数据绑定应用程序。当我向下滚动并单击一个项目时,列表框滚动到顶部。当我不使用堆栈来保存ItemPresenter时,它不会发生。

+0

你可以显示列表框的XAML? – keyboardP

+0

是的,我已经更新了这个问题=) –

回答

0

你可以这样做:

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

谢谢,但这仍然使列表框滚动到顶部。我想在禁用滚动后保留滚动位置。 –

+0

我只是试了一下,它似乎为我工作得很好。你可以发布你的代码吗? – keyboardP

+0

嗨keyboardP,你是对的,默认列表框工作正常,但我有一个自定义模板列表框。请看我更新的问题:-) –

0

你能不能以其他方式设置属性IsHitTestVisible为false禁用滚动?

+0

好吧,不,因为我需要与列表框项目进行交互=) –

0

我有一个我正在处理的小项目,还有一个自定义模板列表框。我测试了下面的代码,这似乎对我来说很好:

ScrollViewer.SetVerticalScrollBarVisibility(YourListBox, ScrollBarVisibility.Disabled); 
YourListBox.ScrollIntoView(YourListBox.SelectedItem);