2009-08-10 25 views
8

Tôi lưới trên điều khiển đèn bạc của mình, tôi lập trình thêm canvas và trong canvas tôi đang tải và hiển thị Hình ảnh.Làm thế nào để buộc ActualWidth và ActualHeight cập nhật (silverlight)

Tôi cũng đang thêm vòng xoay vào canvas. Vấn đề là theo mặc định, CenterX và CenterY của vòng xoay là phía trên cùng bên trái của khung vẽ. Điều tôi muốn là xoay vòng xảy ra xung quanh trung tâm của khung vẽ.

Để làm điều này, tôi đã cố gắng thiết lập các CenterX và centery của Rotation đến hình ảnh ActualWidth/2 và ActualHeight/2, tuy nhiên tôi đã phát hiện ra rằng ActualWidthActualHeight không luôn được phổ biến, ít nhất là không ngay lập tức . Làm thế nào tôi có thể buộc họ được cập nhật?

Thậm chí sử dụng các sự kiện DownloadProgress vào hình ảnh dường như không đảm bảo ActualWidth và ActualHeight được dân cư, và cũng không sử dụng 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)); 

Trả lời

12

Để cập nhật ActualWidthActualHeight của số FrameworkElement bạn sẽ phải gọi UpdateLayout.

+0

Điều đó làm việc cho tôi, cảm ơn! –

+0

Làm việc cho tôi. Cảm ơn. – Jordan

3

Thật không may, việc cập nhật cuộc gọiThanh toán không phải lúc nào cũng hoạt động tùy thuộc vào tình huống của bạn.

Tôi đã có may mắn hơn làm một cái gì đó như:

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

nhưng tất cả đều thất bại quá thường xuyên.

0

phương pháp đáng tin cậy nhất tôi thấy là sử dụng DependencyPropertyDescriptorAddValueChanged thính giả của ActualWidthActualHeight thay vì OnLayoutUpdated để có được kích thước nguyên tố sau khi render

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

Thay vì sử dụng StackPanel, Lưới, v.v. sử dụng phần tử cơ sở mà bạn tùy thuộc vào kích thước tương đối

+0

'DependencyPropertyDescriptor' không có trong Silverlight. – trm

+0

Bạn có thể thử nghe LayoutUpdated hoặc tạo một số chậm trễ bằng cách sử dụng DispatcherTimer, nhưng nó có thể sẽ không đảm bảo kết quả –

Các vấn đề liên quan