2012-10-07 105 views
3

我有一个CanvasTextBlock像这样:的ActualHeight和ActualWidth的始终为零

<Canvas x:Name="ContentPanel" Grid.Row="1" DoubleTapped="ContentPanel_DoubleTapped"> 
     <TextBlock x:Name="WordBlock" FontSize="226.667" FontFamily="Segoe UI Semilight" TextAlignment="Center" 
        RenderTransformOrigin="0.5, 0.5"> 
      <TextBlock.RenderTransform> 
       <TranslateTransform x:Name="translate"/> 
      </TextBlock.RenderTransform> 
     </TextBlock> 
    </Canvas> 

我的应用程序是这样的,当用户浏览该网页时,TextBlock将在Canvas中心和如果TextBlock的宽度比画布的更大,将发生字幕动画:

private void SetAnimation() 
{ 
    Canvas.SetLeft(WordBlock, (ContentPanel.ActualWidth - WordBlock.ActualWidth)/2); 
    Canvas.SetTop(WordBlock, (ContentPanel.ActualHeight - WordBlock.ActualHeight)/2); 

    if (WordBlock.ActualWidth > ContentPanel.ActualWidth) 
    { 
     MarqueeAnimation.From = WordBlock.ActualWidth; 
     MarqueeAnimation.To = -WordBlock.ActualWidth; 
     MarqueeAnimation.Duration = new Duration(new TimeSpan(0, 0, 10)); 
     MarqueeBoard.Begin(); 
    } 
} 

这种方法被称为的OnNavigatedTo。我不知道为什么TextBlock不会居中,因为ActualHeightActualWidth属性总是回到0.0。我不想放置固定尺寸,因为这是一个Windows应用商店应用,并希望它可以跨不同的屏幕尺寸进行缩放。

任何想法?我卡住了。

+0

你是如何设置WordBlock的文本? – wdavo

+0

在上一页中,将TextBox的内容作为导航参数传递,然后从OnNavigatedTo中检索它。 – Martin

回答

5

当OnNavigatedTo被调用时,我不相信该页面实际上已被绘制。在尝试调整大小和重新排列事物时,我也有类似的困惑。答案似乎是要等到页面加载并执行计算,则:

public ChallengePage() 
{ 
    this.InitializeComponent(); 
    this.Loaded += ChallengePage_Loaded; 
} 

void ChallengePage_Loaded(object sender, RoutedEventArgs e) 
{ 
    *Do your calculations which use ActualWidth and ActualHeight in here* 
} 

你需要这样的东西,我相信。将加载的处理程序添加到初始化页面中,然后可以从那里调用SetAnimation。

+0

因此,我将使用OnNavigatedTo检索传递给此页面的单词并将其设置为WordBlock的值,然后调整大小并重新排列Loaded上的所有内容? – Martin

+0

是的,在浏览时对文本进行更改,让页面加载以使其实际呈现对象,然后它们应具有大小,以便可以在加载时重新排列:o) – StarlitSkies