Как сохранить положение прокрутки при отключении прокрутки - PullRequest
2 голосов
/ 08 августа 2011

В моем приложении win phone 7 я хочу отключить вертикальную прокрутку в списке. Но когда я использую

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

Список прокручивается вверх. Как сохранить положение прокрутки, если прокрутка отключена?

Редактировать: Я думаю об отключении прокрутки, проглатывая события до того, как их обработает список. Но когда я попытался обработать ManipulationStarted и ManipulationCompleted, у меня возникло исключение. Какие события я должен обработать, чтобы список не мог прокрутиться? Когда я отмечаю ManipulationStarted, ManipulationDelta и ManipulationCompleted как обработанные в моем коде, я получаю исключение Null с этой трассировкой стека:

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 для отключения виртуализации пользовательского интерфейса. В этом случае при отключении прокрутки список автоматически прокручивается в верхнюю часть.

Редактировать: вот шаблон списка:

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

Ответы [ 3 ]

0 голосов
/ 11 августа 2011

Разве вы не можете установить для свойства IsHitTestVisible значение false, чтобы отключить прокрутку?

0 голосов
/ 11 августа 2011

У меня есть небольшой проект, над которым я работаю, также с настраиваемым шаблонным списком.Я проверил следующий код, и он, кажется, работал нормально для меня:

ScrollViewer.SetVerticalScrollBarVisibility(YourListBox, ScrollBarVisibility.Disabled);
YourListBox.ScrollIntoView(YourListBox.SelectedItem);
0 голосов
/ 08 августа 2011

Вы можете сделать это:

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