2009-08-10 6 views
8

Ich ein Raster auf meinem Silverlight-Steuerelement, ich bin Programmatically Hinzufügen einer Leinwand, und in der Leinwand ich Bild laden und anzeigen.So erzwingen ActualWidth und ActualHeight zu aktualisieren (Silverlight)

Ich habe auch eine Drehung auf der Leinwand. Das Problem besteht darin, dass das CenterX und CenterY der Rotation standardmäßig oben links im Canvas angeordnet ist. Was ich will, ist die Rotation um die Mitte der Leinwand.

Um dies zu tun, ich habe versucht, um die Bilder zu CenterX und CenterY der Rotation Einstellung ActualWidth/2 und ActualHeight/2, ich habe jedoch festgestellt, dass ActualWidth und ActualHeight nicht immer bevölkern, zumindest nicht sofort . Wie kann ich sie zwingen, sich zu aktualisieren?

mit Selbst die DownloadProgress Ereignis auf dem Bild scheint nicht der Actual und Actual zu gewährleisten sind bevölkert, und auch nicht mit this.Dispatcher.BeginInvoke() ...

Image imgTest = new Image(); 
Canvas cnvTest = new Canvas(); 
Uri uriImage = new Uri("myurl", UriKind.RelativeOrAbsolute); 
System.Windows.Media.Imaging.BitmapImage bmpDisplay = new System.Windows.Media.Imaging.BitmapImage(uriImage); 

bmpDisplay.DownloadProgress += new EventHandler<System.Windows.Media.Imaging.DownloadProgressEventArgs>(this.GetActualDimensionsAfterDownload); 

imgTest.Source = bmpDisplay; 
imgTest.Stretch = Stretch.Uniform; 
imgTest.HorizontalAlignment = HorizontalAlignment.Center; 
imgTest.VerticalAlignment = VerticalAlignment.Center; 

cnvTest.Children.Add(imgTest); 

this.grdLayout.Children.Add(imgTest); 
this.Dispatcher.BeginInvoke(new Action(GetActualDimensions)); 

Antwort

12

So aktualisieren Sie die ActualWidth und ActualHeight eines FrameworkElement müssen Sie UpdateLayout aufrufen.

+0

Das hat für mich geklappt, danke! –

+0

Arbeitete auch für mich. Vielen Dank. – Jordan

3

Leider funktioniert der Aufruf von updateLayout nicht immer abhängig von Ihrer Situation.

Ich habe mehr Glück hat, etwas zu tun:

whateverUIElement.Dispatcher.BeginInvoke(() 
    { 
    //code that needs width/height here 
    } 
); 

aber auch das nicht zu oft.

0

zuverlässigste Methode I DependencyPropertyDescriptorAddValueChanged Zuhörer von Actual und Actual statt Elementgrößen nach dem Rendern

DependencyPropertyDescriptor descriptor = DependencyPropertyDescriptor.FromProperty(ActualWidthProperty, typeof(StackPanel)); 
if (descriptor != null) 
{ 
    descriptor.AddValueChanged(uiPanelRoot, DrawPipelines_LayoutUpdated); 
} 

descriptor = DependencyPropertyDescriptor.FromProperty(ActualHeightProperty, typeof(StackPanel)); 
if (descriptor != null) 
{ 
    descriptor.AddValueChanged(uiPanelRoot, DrawPipelines_LayoutUpdated); 
} 


void DrawPipelines_LayoutUpdated(object sender, EventArgs e) 
{ 
    // Point point1 = elementInstrumentSampleVial.TranslatePoint(
    //    new Point(11.0, 15.0), uiGridMainInner); 
} 

Anstelle der Verwendung von Stackpanel zu erhalten OnLayoutUpdated zu verwenden gefunden ist, Gitter usw. verwenden das Basiselement, auf das Sie für die relativen Größen angewiesen sind

+0

'DependencyPropertyDescriptor' ist in Silverlight nicht verfügbar. – trm

+0

Sie könnten versuchen, LayoutUpdated zu hören oder mit DispatcherTimer etwas Verzögerung zu erzeugen, aber es würde wahrscheinlich keine Ergebnisse garantieren –

Verwandte Themen