Как заставить ActualWidth и ActualHeight обновляться (silverlight) - PullRequest
9 голосов
/ 11 августа 2009

Я сетка на моем элементе управления Silverlight, я программно добавляю холст, а на холсте я загружаю и отображаю изображение.

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

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

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

Ответы [ 3 ]

13 голосов
/ 11 августа 2009

Чтобы обновить ActualWidth и ActualHeight из FrameworkElement, вам нужно будет позвонить UpdateLayout.

3 голосов
/ 06 августа 2010

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

Мне повезло, когда я сделал что-то вроде:

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

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

1 голос
/ 17 июня 2014

Самый надежный метод, который я нашел, это использовать DependencyPropertyDescriptor AddValueChanged прослушиватели 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, Grid и т. Д. Используйте базовый элемент, от которого зависит относительный размер

...