2009-06-27 9 views
1

Pourquoi ce travail si bien dans WPFSilverlight Toile sur ScrollViewer ne peut pas déclencher

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
<Canvas x:Name="MyDesigner"> 
</Canvas> 
</ScrollViewer> 

Maintenant, quand je fais la même chose dans silverlight et la charge d'un contrôle « qui peut être déplacé » les barres de défilement ne sont pas déclenchées, lorsque Je fais glisser hors de la vue, rien ne se passe ... mais dans wpf il les montre automatiquement ...

Répondre

1

Voici la solution que j'ai trouvée. Le canevas peut se développer de manière dynamique, mais vous devrez définir explicitement la hauteur à une nouvelle valeur. Donc, si vous avez 20 blocs de texte d'une hauteur de 21, vous devez définir la hauteur de la toile comme suit: Canvas.Height = 22.0 * 100; pour que le scrollviewer prenne la nouvelle hauteur.

MainPage.xaml

<Canvas Canvas.Left="5" Canvas.Top="25" > 
    <ScrollViewer Width="300" Height="700" x:Name="CanSummaryScroller"> 
     <Canvas x:Name="canSummaryCells" > 
     </Canvas> 
    </ScrollViewer> 
</Canvas> 

MainPage.xaml.cs

boxDevSumList est une liste de TextBoxes

for (int i = 0; i < 100; i++) 
{ 
    boxDevSumList.Add(new Cell()); 
    (boxDevSumList.ElementAt(i)).Width = 271; 
    (boxDevSumList.ElementAt(i)).Height = 21; 
    (boxDevSumList.ElementAt(i)).SetValue(FontFamilyProperty, new FontFamily("Calibri")); 
    (boxDevSumList.ElementAt(i)).FontSize = 12; 
    (boxDevSumList.ElementAt(i)).Text = "this is a test"; 
    if (i.Equals(1) || i.Equals(3) || i.Equals(5) || i.Equals(7) || i.Equals(9)) 
     (boxDevSumList.ElementAt(i)).Background = lgBrush; 
    (boxDevSumList.ElementAt(i)).Opacity = .9; 
    canSummaryCells.Children.Add(boxDevSumList.ElementAt(i)); 
    boxDevSumList.ElementAt(i).SetValue(Canvas.TopProperty, (double)(i * 21) + 45); 
    boxDevSumList.ElementAt(i).SetValue(Canvas.LeftProperty, 4.0); 
    canSummaryCells.Height = 22.0 * 100; 
} 
6

Comme une vérification rapide par rapport à la 'gotcha' normale avez-vous explicitement défini les propriétés height/width de la toile?

Si je frappe un peu de XAML à des fins de test et de l'exécuter:

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
    <Canvas x:Name="test" Background="Beige"> 
     <TextBlock Canvas.Left="2000" Canvas.Top="200" Text="test"/> 
    </Canvas> 
</ScrollViewer> 

ne présentera pas de barre de défilement, même si j'ai contenu explicitement créé dans la toile 2000 à la gauche, la largeur de toile non étant défini signifie que le visualiseur de défilement n'a pas de plage à lier pour ainsi dire. La toile sans largeur est considérée est juste infiniment large de ce que je peux voir. Bien que ce ne soit pas la même chose que de faire glisser le concept de mettre un morceau de contenu en dehors de la vue actuelle est là.

Dès que vous ajoutez une largeur, elle définit une zone finie à défiler et la barre de défilement apparaît.

+0

Donc, fondamentalement, il n'y a pas de point inverse cette exception pour garder une taille de toile fixe? – Fredrick

+0

Vous pouvez le contourner d'une autre manière mais en y plaçant une barre de défilement non liée et en associant la valeur du défilement à une transformation de traduction appliquée en tant que partie du groupe de transformation sur le canevas. (Un groupe de transformation permettant plusieurs transformations.) De cette façon, vous pouvez faire défiler, sans une taille de canevas explicite, et la limite du défilement est alors définie par les valeurs que vous avez utilisées pour la barre/transformation. – Andrew

Questions connexes