Почему мой SurfaceScrollViewer не выполняет прокрутку с помощью перетаскивания?

Мы пишем приложение для планшетных ПК с Windows. Я создал пользовательский элемент управления, который использует SurfaceScrollViewer для отображения вертикального и прокручиваемого списка справа от окна. Элемент управления использует Adorner, чтобы добавить себя к декоративному слою окна, чтобы его можно было отобразить поверх содержимого окна.

Это работает очень хорошо, но средство просмотра прокрутки на поверхности будет прокручивать только колесико мыши или полосу прокрутки. Я хотел бы иметь возможность скрыть полосу прокрутки и полагаться на то, что пользователь перетаскивает список на ощупь, но это отказывается работать. Мы использовали элемент управления SurfaceScrollViewer в другом месте этого проекта, и он работал нормально, поэтому я предполагаю, что проблема связана либо с тем, как был создан элемент управления, либо, может быть, с тем, что он находится в AdornerLayer? Что-то связанное с регистрацией касаний в Surface? Странно то, что элементы управления SurfaceButton в списке работают нормально.

Любая помощь или совет будут высоко оценены. Это в основном пользовательский элемент управления. Я удалил несколько связующих элементов, чтобы уменьшить размер, и добавил окружающие элементы Window/AdornerLayer/Adorner, чтобы поместить их в контекст.

РЕДАКТИРОВАТЬ. Декоративный элемент фактически добавляется к декоративному слою сетки, которая является дочерним элементом окна. Я обновил XAML ниже.

<Window x:Name="Main">
    <Grid>
        <AdornerDecorator>

            <!-- Adorner layer added to Window in code-behind -->
            <AdornerLayer>
                <Adorner>

                    <!-- Custom Control Starts Here -->
                    <Grid x:Name="root" Visibility="Collapsed" Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=Window}}" Height="{Binding ActualHeight, RelativeSource={RelativeSource AncestorType=Window}}">

                        <Controls:SurfaceButton x:Name="btnCloser" Opacity="0" Background="White"/>

                        <Grid x:Name="menu" Width="400" HorizontalAlignment="Right" VerticalAlignment="Stretch">

                            <Grid.RowDefinitions>
                                <RowDefinition Height="20"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="20"/>
                                <RowDefinition />
                                <RowDefinition Height="20"/>
                            </Grid.RowDefinitions>

                            <Border Opacity="0.75" BorderThickness="0" Background="Black" Grid.RowSpan="5" />

                            <TextBlock Text="{TemplateBinding Title}" FontSize="24" Grid.Row="1" Foreground="White" HorizontalAlignment="Center" Margin="10"/>

                            <Controls:SurfaceScrollViewer Grid.Row="3" Margin="5" Elasticity="0.0, 0.5" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
                                <ItemsControl x:Name="items" Background="Transparent" ItemsSource="{TemplateBinding MenuItems}">
                                    <ItemsControl.Style>
                                        <Style>
                                            <Setter Property="ItemsControl.ItemsPanel">
                                                <Setter.Value>
                                                    <ItemsPanelTemplate>
                                                        <StackPanel />
                                                    </ItemsPanelTemplate>
                                                </Setter.Value>
                                            </Setter>
                                            <Setter Property="ItemsControl.ItemTemplate">
                                                <Setter.Value>
                                                    <DataTemplate>
                                                        <Controls:MyButton HorizontalContentAlignment="Center" Margin="3" Content="(Bound Stuff)" Background="(Bound Stuff)"/>
                                                    </DataTemplate>
                                                </Setter.Value>
                                            </Setter>
                                        </Style>
                                    </ItemsControl.Style>
                                </ItemsControl>
                            </Controls:SurfaceScrollViewer>

                        </Grid>
                    </Grid>
                </Adorner>
            </AdornerLayer>
        </AdornerDecorator>
    </Grid>
</Window>

person Matt Winward    schedule 26.03.2012    source источник
comment
На данный момент мне пришлось добавить полосу прокрутки в SurfaceScrollViewer, чтобы обойти эту проблему. Это означает, что пользователи планшетов могут использовать это как минимум для прокрутки списка. Странно то, что когда вы используете полосу прокрутки, она иногда блокируется и перестает работать, пока содержимое не будет перезагружено. Это как-то связано с AdornerLayer??   -  person Matt Winward    schedule 27.03.2012


Ответы (2)


Хорошо - я добрался до сути. Я понял, что ответ один и тот же, который возникал несколько раз во время этого проекта, но все равно время от времени теряю его из виду. Может быть, на этот раз он утонет навсегда!

Проблема была в ItemsControl. Это не элемент управления Surface, поэтому он не очень хорошо сочетается с элементами управления Surface. Я думаю, что, по сути, происходит то, что элементы управления Surface имеют тенденцию поглощать события, прежде чем что-либо еще получает шанс — или, может быть, все наоборот.

Во всяком случае, я заменил его следующим SurfaceListBox, и это сработало!

<Controls:SurfaceListBox x:Name="items" Margin="5" Grid.Row="3" Background="Transparent" ItemsSource="{TemplateBinding MenuItems}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Hidden">
    <Controls:SurfaceListBox.Resources>
        <Converters:PropertyNameReflectionConverter x:Key="ButtonContentConverter"/>
        <Converters:SelectedItemBackgroundConverter x:Key="ButtonBackgroundConverter"/>
    </Controls:SurfaceListBox.Resources>
    <Controls:SurfaceListBox.ItemContainerStyle>
        <Style TargetType="Controls:SurfaceListBoxItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Controls:SurfaceListBoxItem}">
                        <ContentPresenter />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Controls:SurfaceListBox.ItemContainerStyle>
    <Controls:SurfaceListBox.ItemTemplate>
        <DataTemplate DataType="Controls:MyButton">
            <Controls:MyButton HorizontalContentAlignment="Center" Margin="3" Background="(Bound Stuff)" Content="(Bound Stuff)"/>
        </DataTemplate>
    </Controls:SurfaceListBox.ItemTemplate>
</Controls:SurfaceListBox>
person Matt Winward    schedule 27.03.2012

Проблема заключается не в ItemsControl, а в самом SurfaceScrollViewer, поскольку вы можете разрешить прокрутку с помощью касания/мыши путем перетаскивания, установите для PanningMode SurfaceScrollViewer значение, отличное от «Нет».

person Imran Shaik    schedule 31.07.2012