对象的ActualHeight和ActualWidth始终为零

3

我有一个包含 TextBlockCanvas

<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的宽度大于Canvas的宽度,则会出现跑马灯动画:

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 Store应用程序,并希望它能够适应不同的屏幕尺寸。

有什么想法吗?我卡住了。


你是如何为WordBlock设置文本的? - wdavo
在上一页中,将TextBox的内容作为导航参数传递,然后从OnNavigatedTo方法中检索它。 - Martin
1个回答

6

当调用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*
}

我认为你需要这样做。在页面的初始化中添加Loaded处理程序,然后你可以从那里调用SetAnimation。


那么我将使用OnNavigatedTo来检索我传递到此页面的单词,并将其设置为WordBlock的值,然后在Loaded事件中调整大小和重新排列所有内容? - Martin
是的,在您导航时更改文本,让页面加载,以便实际呈现对象,然后它们应该具有大小,以便您可以在已加载的情况下重新排列 :o) - StarlitSkies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接