Мы пишем приложение для планшетных ПК Windows. Я создал настраиваемый элемент управления, который использует SurfaceScrollViewer
для отображения вертикального и прокручиваемого списка справа от окна. Элемент управления использует Adorner, чтобы добавить себя к слою adorner Window, чтобы он мог отображаться поверх содержимого окна.Почему мой SurfaceScrollViewer не перетаскивает прокрутку?
Он работает действительно красиво, но средство просмотра прокрутки по поверхности будет прокручивать только колесо мыши или через полосу прокрутки. Я хотел бы иметь возможность скрывать полосу прокрутки и полагаться на пользователя, который перетаскивает список, но это не работает. Мы использовали элемент управления SurfaceScrollViewer
в другом месте этого проекта, и это сработало хорошо, поэтому я предполагаю, что эта проблема сводится к тому, как был создан элемент управления, или, может быть, потому, что он находится в AdornerLayer? Что-то связанное с регистрацией касания поверхности? Странная вещь в том, что элементы управления SurfaceButton
в списке работают нормально.
Любая помощь или совет были бы наиболее ценными. Это в основном пользовательский контроль. Я удалил пару привязывающих битов и кусков, чтобы сократить размер, и я добавил окружающие элементы Window/AdornerLayer/Adorner, чтобы поместить его в контекст.
EDIT - Adorner фактически добавлен к слою adorner Grid, который является дочерним элементом Window. Я обновил 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>
На данный момент мне пришлось добавить панель прокрутки в SurfaceScrollViewer, чтобы обойти эту проблему. Это означает, что пользователи планшета могут, по крайней мере, использовать это для прокрутки списка. Странно, что когда вы используете полосу прокрутки, она иногда блокируется и перестает работать до тех пор, пока содержимое не будет перезагружено. Это как-то связано с AdornerLayer ?? –