1

我们正在为 Windows 平板电脑编写应用程序。我创建了一个自定义控件,它使用 aSurfaceScrollViewer在窗口右侧呈现一个垂直且可滚动的列表。该控件使用 Adorner 将自身添加到 Window 的装饰层,以便可以在窗口内容的顶部呈现它。

它工作得非常好,但表面滚动查看器只能通过鼠标滚轮或滚动条滚动。我希望能够隐藏滚动条并依靠用户通过触摸拖动列表,但这无法正常工作。我们已经SurfaceScrollViewer在这个项目的其他地方使用了控件,并且效果很好,所以我猜这个问题取决于控件是如何构建的,或者可能是因为它位于 AdornerLayer 中?与 Surface 注册触摸有关吗?奇怪的是SurfaceButton列表中的控件工作正常。

任何帮助或建议将不胜感激。这基本上是自定义控件。我已经删除了一些绑定的零碎以减小尺寸,并且我添加了周围的 Window/AdornerLayer/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>
4

2 回答 2

1

好的 - 我明白了。我意识到答案与这个项目中多次出现的答案相同,但我仍然时不时地忽略它。也许这一次它会永远沉沦!

问题是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>
于 2012-03-27T13:40:35.097 回答
0

问题不在于 ItemsControl 而是 SurfaceScrollViewer 本身,您可以通过拖动将 SurfaceScrollViewer 的 PanningMode 设置为“None”以外的方式使用触摸/鼠标滚动。

于 2012-07-31T08:07:31.523 回答