2009-06-27 7 views
1

Auslösung Warum funktioniert das so gut in wpfSilverlight Leinwand auf Scroll nicht

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

Nun, wenn ich das gleiche tun in Silverlight und laden eine Kontrolle der Rollbalken „die gezogen werden kann“ werden nicht ausgelöst, wenn Ich schiebe aus der Sicht, nichts passiert ... aber in WPF zeigt es automatisch ...

Antwort

1

Hier ist die Lösung, die ich gefunden habe. Die Zeichenfläche kann dynamisch wachsen, aber Sie müssen die Höhe explizit auf einen neuen Wert festlegen. Also, wenn Sie 20 Textblöcke mit einer Höhe von 21 haben, müssen Sie die Leinwand Höhe wie einstellen: Canvas.Height = 22.0 * 100; für den Scrollviewer, um die neue Höhe aufzunehmen.

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 ist eine Liste der Textfelder

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

Als eine schnelle Überprüfung gegen die normale 'Gotcha' haben Sie explizit die Leinwand Höhe/Breite Eigenschaften?

Wenn ich einige XAML zu Testzwecken klopfen und führen Sie es:

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

nicht eine Bildlaufleiste zeigen werden, auch wenn ich die Leinwand Breite nicht explizit Inhalt in der Leinwand 2000 auf der linken Seite erstellt haben, gesetzt zu sein bedeutet, dass der Scroll-Viewer keine Reichweite hat, um sozusagen zu binden. Die Leinwand ohne Breite ist nur unendlich weit von dem, was ich sehen kann. Dies ist zwar nicht dasselbe wie das Ziehen des Konzepts, ein Stück Inhalt außerhalb der aktuellen Ansicht zu platzieren.

Sobald Sie eine Breite hinzufügen, wird ein endlicher Bereich zum Scrollen definiert und die Bildlaufleiste wird angezeigt.

+0

Also im Grunde gibt es keinen Punkt umgekehrt diese Ausnahme um eine feste Leinwandgröße zu behalten? – Fredrick

+0

Sie könnten es auf andere Weise umgehen, aber eine nicht verknüpfte Bildlaufleiste einfügen und den Wert in der Bildlaufleiste mit einer Übersetzungsumwandlung verknüpfen, die als Teil der Transformationsgruppe auf der Zeichenfläche angewendet wird. (Eine Transformationsgruppe, die mehrere Transformationen zulässt.) Auf diese Weise können Sie ohne eine explizite Leinwandgröße scrollen, und die Grenze des Scrolls wird dann durch die Werte festgelegt, die Sie für die Leiste/Transformation verwendet haben. – Andrew