我在silverlight控件上有一个网格,我以编程方式添加了一个画布,在画布中我正在加载并显示Image。
我还在画布上添加一个旋转。问题是默认情况下,旋转的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));
答案 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等,而是使用依赖于相对大小的基本元素