2009-08-10 4 views
8

Я сетка на моем элементе управления silverlight, я программно добавляю холст, а на холсте я загружаю и показываю изображение.Как заставить ActualWidth и ActualHeight обновить (silverlight)

Я также добавляю поворот к холсту. Проблема в том, что по умолчанию CenterX и CenterY вращения являются верхним левым краем холста. Я хочу, чтобы вращение происходило вокруг центра холста.

Чтобы сделать это, я попытался установить CenterX и CenterY вращения с изображениями ActualWidth/2 и ActualHeight/2, однако я обнаружил, что ActualWidth и ActualHeight не всегда заселена, по крайней мере, не сразу , Как заставить их обновляться?

Даже не используя событие DownloadProgress на изображение, кажется, не гарантирует ActualWidth и ActualHeight заселены, и ни делает с помощью 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)); 

ответ

12

Чтобы обновить ActualWidth и ActualHeightFrameworkElement вам необходимо позвонить по номеру UpdateLayout.

+0

Это сработало для меня, спасибо! –

+0

Работал и для меня. Благодарю. – Jordan

3

К сожалению, вызов updateLayout не всегда работает в зависимости от вашей ситуации.

Я больше повезло делать что-то вроде:

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

, но даже это не может слишком часто.

0

Наиболее надежный метод, который я нашел, чтобы использовать DependencyPropertyDescriptorAddValueChanged слушателей ActualWidth и ActualHeight вместо OnLayoutUpdated, чтобы получить размеры элементов после рендеринга

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); 
} 

Вместо использования StackPanel, Сетка и т. Д. Используйте базовый элемент, который зависит от относительных размеров.

+0

'DependencyPropertyDescriptor' недоступен в Silverlight. – trm

+0

Вы можете попробовать прослушать LayoutUpdated или создать некоторую задержку с помощью DispatcherTimer, но это, вероятно, не гарантирует результатов –

 Смежные вопросы

  • Нет связанных вопросов^_^