在我的win phone 7 app中,我想禁用列表框中的垂直滚动。但是当我使用
时listbox.SetValue(ScrollViewer.VerticalScrollBarVisibilityProperty, ScrollBarVisibility.Disabled);
列表框滚动到顶部。如何在禁用滚动的同时保留滚动位置?
编辑:我正在考虑通过在列表框处理它们之前吞下事件来禁用滚动。但是当我尝试处理ManipulationStarted和ManipulationCompleted时,我有例外。我应该处理哪些事件使列表框无法滚动? 当我在我的代码中标记ManipulationStarted,ManipulationDelta和ManipulationCompleted时,我有这个堆栈跟踪的Null Exception:
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虚拟化。在禁用滚动的情况下,列表框会自动滚动到顶部。
编辑:这是列表框的模板:
<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 :(得分:0)
你可以这样做:
ScrollViewer.SetVerticalScrollBarVisibility(listbox, ScrollBarVisibility.Disabled);
答案 1 :(得分:0)
否则你不能将属性IsHitTestVisible设置为false来禁用滚动吗?
答案 2 :(得分:0)
我正在处理一个小项目,还有一个自定义模板列表框。我测试了以下代码,这似乎对我来说很好:
ScrollViewer.SetVerticalScrollBarVisibility(YourListBox, ScrollBarVisibility.Disabled);
YourListBox.ScrollIntoView(YourListBox.SelectedItem);