Ich animiere ein TextBlock
. In 60 Sekunden erhöht sich FontSize
von 8pt auf 200pt. Alles funktioniert gut, nur dass sich meine Animation ein wenig nach oben und unten bewegt, während der Text wächst. Warum passiert das und ist es möglich dies zu vermeiden?WPF: Animation ist nicht glatt
Ich habe eine sehr einfache XAML-Datei:
<Window x:Class="Timer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="800"
Height="500"
Title="MainWindow"
Loaded="Window_Loaded">
<Grid>
<TextBlock
Name="TimerTextBlock"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="00h : 00m : 00.000s" />
</Grid>
</Window>
Und ebenso einfache Code-behind:
public partial class MainWindow : Window
{
private const string timerFormat = "{0:hh'h : 'mm'm : 'ss'.'fff's'}";
private DispatcherTimer dispatcherTimer;
private DateTime targetTime;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
targetTime = DateTime.Now.AddSeconds(60);
double totalTime = targetTime.Subtract(DateTime.Now).TotalMilliseconds;
DoubleAnimation animation = new DoubleAnimation();
animation.From = TimerTextBlock.FontSize;
animation.To = 200;
animation.Duration = new Duration(targetTime.Subtract(DateTime.Now));
TimerTextBlock.BeginAnimation(TextBlock.FontSizeProperty, animation);
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Interval = TimeSpan.FromMilliseconds(1);
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Start();
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
if (DateTime.Compare(targetTime, DateTime.Now) > 0)
{
TimerTextBlock.Text =
string.Format(timerFormat, targetTime.Subtract(DateTime.Now));
}
}
}
Danke für alle Erklärungen.
Ich kam zu dem Schluss, dass es definitiv das Problem mit "Pixel Splitting" ist. Es macht Sinn, ein bisschen zu hacken, da das Steuerelement in eine Situation kommt, in der es irgendwo zwischen zwei Pixeln gezeichnet werden muss. Aber gibt es einen Weg, dies irgendwie zu vermeiden? – Boris
Ich habe nach Antworten im Internet gesucht und bin auf einige "MatrixAnimations" gestoßen. Was ist das, könnte es den Trick machen? (Und wenn ja, wie?) – Boris