Wpf ActualWidth始终为0且宽度为NaN

时间:2014-07-01 19:25:59

标签: c# wpf

我正在尝试在WPF Windows中的画布中间创建一个小倒计时(3,2,1)。

这么容易,但是我有一些意想不到的麻烦将标签设置在画布的中间。

我从这个线程What is the difference between Width and ActualWidth in WPF?中了解到,当它们被自动设置时,宽度和高度是NaN,这很好。 但ActualWidth / Height为0,我看不到任何其他属性,这给了我需要的值。 我的代码看起来像这样:

void CountDown(object sender, ElapsedEventArgs e)
{
    Application.Current.Dispatcher.Invoke(() =>
    {
        TryRemoveLabel();
        if (_countDown > 0)
        { 
            Label lbl = CreateCountDownLabel();
            _gameField.Children.Add(lbl);
            Canvas.SetZIndex(lbl, 3);
            double left = (_gameField.ActualWidth / 2) - (lbl.Width / 2);
            Canvas.SetLeft(lbl, left);
            double top = (_gameField.ActualHeight / 2) - (lbl.Height / 2);
            Canvas.SetTop(lbl, top);
        }
        else
        {
            _timer.Stop();
            _startCallback();
        }
    });
}

所以CountDown是_timer的Elapsed事件。我删除了标签,只要倒计时是> 0,我创建一个新的。但是如你所见,不是lbl.Width,也不是ActualWidth等。

CreateCountDownLabel看起来像这样:

private Label CreateCountDownLabel()
{
    Label result = new Label();
    result.FontSize = 100;
    //result.Height = 300;
    //result.Width = 300;
    switch (_countDown)
    {
        case 3:
            result.Foreground = Brushes.LightGreen;
            break;
        case 2:
            result.Foreground = Brushes.LightBlue;
            break;
        case 1:
            result.Foreground = Brushes.LightPink;
            break;
    }
    result.Content = (_countDown--);
    return result;
}

我也在问,因为我想做类似但有不同字体的东西,所以用自动高度/宽度来做这件事会很棒。

我在这里做了一件可怕的错事吗?

0 个答案:

没有答案