2012-03-26 3 views
1

私たちはWindowsタブレットPC用のアプリケーションを作成しています。 SurfaceScrollViewerを使用して、ウィンドウの右側に垂直およびスクロール可能なリストをレンダリングするカスタムコントロールを作成しました。コントロールはAdornerを使用してウィンドウのアドナーレイヤーに自身を追加し、ウィンドウコンテンツの上部にレンダリングすることができます。SurfaceScrollViewerがドラッグスクロールしないのはなぜですか?

これはとてもうまく動作しますが、サーフェススクロールビューアはマウスホイールまたはスクロールバーを介してのみスクロールします。私はスクロールバーを隠すことができ、ユーザーがタッチでリストをドラッグすることに頼ることができますが、これは動作を拒否します。私たちはこのプロジェクトのSurfaceScrollViewerコントロールをこのプロジェクトのどこかで使用しましたが、これはうまくいきました。この問題は、コントロールがどのように構築されているか、あるいはAdornerLayerにあるからでしょうか? Surfaceとの接触登録には何か?奇妙なことは、リスト内のSurfaceButtonコントロールが正常に機能していることです。

ご迷惑をおかけして申し訳ございません。これは基本的にカスタムコントロールです。私はサイズを減らすためにいくつかの束縛ビットと部分を削除しました。そして、周囲のWindow/AdornerLayer/Adorner要素を追加してコンテキストに入れました。

EDIT - 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> 
+0

今のところ、この問題を回避するために、スクロールバーをSurfaceScrollViewerに追加する必要がありました。これは、タブレットユーザーが少なくともそのリストをスクロールするために使用できることを意味します。奇妙なことは、スクロールバーを使用すると、コンテンツが再ロードされるまでロックされて動作を停止することがあることです。これはAdornerLayerと関係がありますか? –

答えて

1

わかりました - 私はその底にいました。答えは、このプロジェクトで何度も出てきた答えと同じですが、それでも私はまだそれを見失っています。たぶんこの時間は良いために沈むでしょう!

問題はItemsControlでした。これはサーフェスコントロールではないため、サーフェイスコントロールではうまくいきませんでした。私は本質的に何が起こるかは、サーフェイスコントロールが何か他のものがチャンスを得る前にイベントを嫌う傾向があることだと思います。

とにかく、私は次の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

問題は、あなたが「なし」以外にSurfaceScrollViewerの設定PanningModeをドラッグすることにより、タッチ/マウスでスクロールできるようにするために、ItemsControlのが、SurfaceScrollViewerそのものではありません。

関連する問題