2012-03-26 2 views
1

우리는 Windows 태블릿 PC 용 응용 프로그램을 작성 중입니다. SurfaceScrollViewer을 사용하여 창의 오른쪽에 수직 및 스크롤 가능 목록을 렌더링하는 사용자 지정 컨트롤을 만들었습니다. 컨트롤은 Adorner를 사용하여 Window 컨텐트의 맨 위에 렌더링 될 수 있도록 Window의 adorner 레이어에 자신을 추가합니다.내 SurfaceScrollViewer가 드래그 스크롤되지 않는 이유는 무엇입니까?

정말 멋지게 작동하지만 표면 스크롤 뷰어는 마우스 휠이나 스크롤 막대를 통해서만 스크롤합니다. 스크롤 막대를 숨기고 터치로 목록을 드래그하는 사용자에게 의존하고 싶습니다. 그러나이 작업을 거부합니다. 우리는이 프로젝트의 SurfaceScrollViewer 컨트롤을이 프로젝트의 다른 곳에서 사용했습니다. 그래서이 문제는 컨트롤이 빌드 된 방법이나 AdornerLayer에 있기 때문에 문제가 될 것이라고 생각합니다. 표면에 접촉을 등록하는 것과 관련이 있습니까? 이상한 점은 목록의 SurfaceButton 컨트롤이 제대로 작동한다는 것입니다.

어떤 도움이나 조언을 주시면 감사하겠습니다. 이것은 기본적으로 사용자 정의 컨트롤입니다. 크기를 줄이기 위해 몇 개의 바인딩 비트와 조각을 제거했으며 주변 Window/AdornerLayer/Adorner 요소를 추가하여 컨텍스트에 넣었습니다.

EDIT - adorner는 실제로 창 자식 인 Grid의 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입니다. 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> 
0

문제는 ItemsControl에 있지만 SurfaceScrollViewer 자체를하지, 당신은 "없음"이외로 SurfaceScrollViewer의 PanningMode를 설정 드래그하여 터치/마우스로 스크롤 수 있도록하기 위해.