9

我的 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)); 
4

3 回答 3

14

要更新ActualWidthand ActualHeightFrameworkElement您必须调用UpdateLayout.

于 2009-08-10T20:11:03.863 回答
3

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

我有更好的运气做类似的事情:

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

但即使这样也经常失败。

于 2010-08-05T21:14:04.663 回答
1

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

于 2014-06-17T10:21:18.123 回答