2013-02-28 2 views
4

Je le code suivant (en abrégé) dans ma fenêtre principale:contrôle par l'utilisateur ScrollViewer ne défile pas dans WPF

Bien que je mets les deux barres de défilement et visibilités CanContentScroll propriétés, il ne défile pas. Je suppose que cela a à voir avec le contrôle de mon utilisateur.

<Window> 
    <Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions> 
     <TabControl Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" Margin="0" VerticalAlignment="Stretch" Height="Auto" Width="Auto"> 
      <TabItem Header="TEST"> 
      <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"> 
      <my:MY_USER_CONTROL x:Name="myUserControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ScrollViewer.CanContentScroll="True" /> 
      </ScrollViewer> 
     </TabItem> 
     </TabControl> 
     <Button Grid.Column="0" Grid.Row="2" >a button</Button> 
     <WrapPanel Grid.Column="0" Grid.Row="3" > 
     </WrapPanel> 
    </Grid> 
    </Window> 

Structure abrégée de mon contrôle utilisateur:

<UserControl> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="183*" /> 
      <ColumnDefinition Width="117*" /> 
     </Grid.ColumnDefinitions> 
     <TreeView ItemsSource="{Binding Children}" Grid.ColumnSpan="2"> 
      <TreeView.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}"> 

        <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
        <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 

        <Setter Property="FontWeight" Value="Normal" /> 
        <Style.Triggers> 
         <Trigger Property="IsSelected" Value="True"> 
          <Setter Property="FontWeight" Value="Bold" /> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </TreeView.ItemContainerStyle> 

      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding Children}" > 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition></ColumnDefinition> 
          <ColumnDefinition></ColumnDefinition> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition></RowDefinition> 
         </Grid.RowDefinitions> 
         <Grid.Children> 
          <TextBlock Background="LightGray" Padding="2" Margin="2" Grid.Row="0" Grid.Column="0" Text="{Binding Name}" /> 
          <TextBlock Padding="2" Margin="2" Grid.Row="0" Grid.Column="1" Text="{Binding Content}" /> 
         </Grid.Children> 
        </Grid> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
     </TreeView> 
    </Grid> 
</UserControl> 

Répondre

6

Vous devez le définir comme ceci. J'ai changé le RowDefinition pour Row0 à Height = "*" Donc, il utilisera autant d'espace que possible. Puis changé de place entre le ScrollViewer et le TabControl. Le TabControl est donc un contenu du ScrollViewer.

<Window> 
<Grid> 
    <Grid.RowDefinitions> 
    <RowDefinition Height="*" /> 
    <RowDefinition Height="*" /> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition/> 
    </Grid.ColumnDefinitions> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" 
       VerticalScrollBarVisibility="Auto" 
       Grid.Column="0" Grid.Row="0"> 
    <TabControl HorizontalAlignment="Stretch" Margin="0" VerticalAlignment="Stretch" 
       Height="Auto" Width="Auto"> 
     <TabItem Header="TEST"> 
     <my:MY_USER_CONTROL x:Name="myUserControl" 
          HorizontalAlignment="Stretch"    
          VerticalAlignment="Stretch" 
          ScrollViewer.CanContentScroll="True" />   
    </TabItem> 
    </TabControl> 
</ScrollViewer> 
<Button Grid.Column="0" Grid.Row="2" >a button</Button> 
<WrapPanel Grid.Column="0" Grid.Row="3" > 
</WrapPanel> 
</Grid> 

+0

Ne fonctionne que si je définis aussi 'Height' pour' ScrollViewer'. Mais régler la hauteur de 'ScrollViewer' n'est pas ce que je veux. – Onur

+1

Essayez de modifier votre RowDefinition pour Row0 à; hijack

+0

Cela a fait l'affaire! Postez-le comme une réponse et je l'accepterai. – Onur

0

On dirait que le contenu intérieur de votre ScrollViewer est la même taille que le spectateur donc il n'y a rien à faire défiler?

si vous faites quelque chose comme

<ScrollViewer HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"> 
    <Grid Background="Red"> 

    </Grid> 
</ScrollViewer> 

Ensuite, la grille est la même taille que le spectateur de défilement et ne sera jamais permettre le défilement, si vous définissez la hauteur de la grille à plus que le spectateur peut vous afficher » Je vais avoir un scroller.

<ScrollViewer HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"> 
    <Grid Background="Red" Height="500"> 

    </Grid> 
</ScrollViewer> 
+0

Réglage ' la hauteur de '' à une valeur fixe n'a pas vraiment aider. Le contrôle a maintenant une hauteur fixe mais il ne peut pas être défilé. La définition de la hauteur de 'ScrollViewer' à une valeur fixe permettait de faire défiler le contenu, mais j'aimerais vraiment que' ScrollViewer' prenne l'espace disponible. – Onur

1

Lorsque vous définissez CanContentScroll-vrai, ScrollViewer suppose que votre contenu implémente IScrollInfo (qui je suppose Indifférent Fume). Essayez de définir CanContentScroll sur le ScrollViewer sur false, ce qui permet au contenu d'utiliser autant d'espace qu'il le souhaite et le ScrollViewer s'occupe du défilement.

Toutefois, en fonction de la taille, le nombre de visuels, etc. de votre contrôle, cela pourrait devenir un problème de performance (par exemple pas de la virtualisation de l'interface utilisateur lorsque CanContentScroll est réglé sur Faux).

+1

La définition de 'CanContentScroll' à' false' n'a pas aidé. Je suppose maintenant que la raison en est que le 'ScrollViewer' lui-même pense qu'il peut utiliser un espace illimité et n'a donc pas besoin de faire défiler le contenu car il s'intègre dans le grand' ScrollViewer 'illimité. Ceci est dû au fait que les paramètres du 'ScrollViewer' à une hauteur/largeur définie permettent le défilement. Mais je ne veux pas limiter la taille du 'ScollViewer' qui devrait utiliser tout l'espace disponible. – Onur