Почему мой SurfaceScrollViewer не перетаскивается? - PullRequest
1 голос
/ 26 марта 2012

Мы пишем приложение для планшетных ПК с Windows. Я создал пользовательский элемент управления, который использует SurfaceScrollViewer для визуализации вертикального и прокручиваемого списка справа от окна. Элемент управления использует Adorner, чтобы добавить себя в слой 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>

Ответы [ 2 ]

1 голос
/ 27 марта 2012

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

Проблема была в 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>
0 голосов
/ 31 июля 2012

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

...