2009-08-10 2 views
8

내 실버 라이트 컨트롤의 눈금, 프로그래밍 방식으로 캔버스를 추가하는 중 캔버스에 이미지를로드하고 표시하는 중입니다.ActualWidth 및 ActualHeight를 강제로 업데이트하는 방법 (실버 라이트)

캔버스에 회전을 추가하고 있습니다. 문제는 기본적으로 회전의 CenterX 및 CenterY가 캔바스의 왼쪽 상단에 있다는 것입니다. 내가 원하는 것은 회전이 캔버스의 중심 주위에서 일어나는 것입니다.

이 작업을 수행하려면, 그러나 나는 내가 ActualWidthActualHeight 항상 적어도 지금 당장, 채워지지 않습니다 것을 발견했습니다의 이미지 ActualWidth/2 및 ActualHeight/2 회전의 CenterX 및 CenterY을 설정하려고했습니다 . 어떻게 강제 업데이트 할 수 있습니까?

심지어

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

답변

12

ActualWidth를 업데이트 할 ... ActualWidth와의 ActualHeight이 채워집니다 보장하지 않는 것 이미지에 DownloadProgress 이벤트를 사용하지 않으며, 어느 쪽도 this.Dispatcher.BeginInvoke()를 사용하여 않습니다 ActualHeightFrameworkElement이면 UpdateLayout으로 전화해야합니다.

+0

그게 내게 고마워, 고마워! –

+0

나를 위해 일했습니다. 감사. – Jordan

3

불행히도 updateLayout을 호출하는 것이 상황에 따라 항상 작동하는 것은 아닙니다.

내가 더 잘 행운 같은 일을 했어 :

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

을하지만, 심지어 너무 자주 실패합니다. 내가 찾은

0

가장 신뢰할 수있는 방법은이 ActualWidth 청취자를 AddValueChanged DependencyPropertyDescriptor와 StackPanel의를

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

렌더링 대신 사용 후 요소 크기를 얻을 수을 OnLayoutUpdated 대신 의 ActualHeight를 사용하는 것입니다, 눈금 등은 상대 크기에 따라 달라지는 기본 요소를 사용합니다.

+0

Silverlight에서는'DependencyPropertyDescriptor'를 사용할 수 없습니다. – trm

+0

당신은 LayoutUpdated를 듣거나 DispatcherTimer를 사용하여 약간의 지연을 만들 수 있습니다. 그러나 아마도 결과를 보장하지 못할 것입니다. –