如何强制ActualWidth和ActualHeight更新(silverlight)

时间:2009-08-10 20:01:18

标签: silverlight actualwidth actualheight

我在silverlight控件上有一个网格,我以编程方式添加了一个画布,在画布中我正在加载并显示Image。

我还在画布上添加一个旋转。问题是默认情况下,旋转的CenterX和CenterY是画布的左上角。我想要的是围绕画布中心的旋转。

为此,我尝试将旋转的CenterX和CenterY设置为图像ActualWidth / 2和ActualHeight / 2,但我发现ActualWidthActualHeight并非总是填充,至少不会立即填充。我怎样才能强迫他们更新?

即使在图像上使用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)); 

3 个答案:

答案 0 :(得分:13)

要更新ActualWidth的{​​{1}}和ActualHeight,您必须致电FrameworkElement

答案 1 :(得分:3)

不幸的是,根据您的具体情况,调用updateLayout并不总是有效。

我有更好的运气,比如:

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

但即便如此也经常失败。

答案 2 :(得分:1)

我发现最可靠的方法是使用 ActualWidth DependencyPropertyDescriptor AddValueChanged 侦听器而不是 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等,而是使用依赖于相对大小的基本元素