1

Windows タブレット PC 用のアプリケーションを作成しています。SurfaceScrollViewerを使用して、ウィンドウの右側に垂直方向のスクロール可能なリストをレンダリングするカスタム コントロールを作成しました。コントロールは Adorner を使用して Window の adorner レイヤーに自身を追加し、ウィンドウ コンテンツの上にレンダリングできるようにします。

これは非常にうまく機能しますが、サーフェス スクロール ビューアはマウス ホイールまたはスクロール バーでしかスクロールできません。スクロールバーを非表示にして、ユーザーがタッチでリストをドラッグできるようにしたいのですが、これはうまくいきません。このプロジェクトの他の場所でコントロールを使用しましたが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>
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 に答える