我正在尝试在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;
}
我也在问,因为我想做类似但有不同字体的东西,所以用自动高度/宽度来做这件事会很棒。
我在这里做了一件可怕的错事吗?