我们正在为Windows平板电脑编写一个应用程序。我创建了一个自定义控件,该控件使用SurfaceScrollViewer
在窗口右侧呈现垂直滚动列表。控件使用装饰器将自己添加到窗口的装饰器层,以便可以在窗口内容的顶部进行渲染。
它工作得很好,但曲面滚动查看器只能滚动鼠标滚轮或滚动条。我希望能够隐藏滚动条,并依靠用户通过触摸拖动列表,但这不起作用。我们在这个项目的其他地方使用了SurfaceScrollViewer
控件,效果很好,所以我猜这个问题要么是因为控件是如何构建的,要么是因为它在AdornerLayer中?与Surface注册触摸有关?奇怪的是,列表中的SurfaceButton
控件运行良好。
任何帮助或建议都将不胜感激。这基本上是自定义控件。我删除了一些绑定的部分来减少大小,并添加了周围的Window/AdornerLayer/Adorner元素来将其置于上下文中。
EDIT-装饰器实际上被添加到网格的装饰器层,该网格是窗口的子级。我已经更新了下面的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>
好吧,我已经追根究底了。我意识到答案和这个项目中多次出现的答案是一样的,但我仍然时不时地看不见它。也许这一次它会永远消失!
问题出在ItemsControl上。它不是曲面控件,因此它与曲面控件的配合不好。我认为,本质上发生的是,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>
问题不在于ItemsControl,而在于SurfaceScrollViewer本身,您可以通过拖动来允许使用触摸/鼠标滚动,并将SurfaceScrllViewer的PanningMode设置为"无"以外的模式。