3

私は次CanvasTextBlockようなものを持っています:

<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が中央に配置され、CanvasTextBlock幅がキャンバスの幅よりも大きい場合、マーキー アニメーションが発生するようになっています。

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 と呼ばれます。およびプロパティが常に 0.0 として返されるTextBlockため、 が中央に表示されない理由がわかりません。これは Windows ストア アプリであり、さまざまな画面サイズに合わせて拡張できるようにしたいため、固定サイズを配置したくありません。ActualHeightActualWidth

何か案は?私は立ち往生しています。

4

1 に答える 1

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*
}

そのようなものが必要になると思います。Loaded ハンドラーをページの初期化に追加すると、そこから SetAnimation を呼び出すことができます。

于 2012-10-07T10:12:21.953 に答える