2008-11-24 7 views
4

C#:МОФ раскадровки смерти

public partial class MainWindow : Window 
{ 
    Storyboard a = new Storyboard(); 
    int i; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     a.Completed += new EventHandler(a_Completed); 
     a.Duration = TimeSpan.FromMilliseconds(10); 
     a.Begin(); 
    } 

    void a_Completed(object sender, EventArgs e) 
    { 
     textblock.Text = (++i).ToString(); 
     a.Begin(); 
    } 
} 

XAML:

<Window x:Class="Gui.MainWindow" x:Name="control" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="MainWindow" Height="300" Width="300"> 
<Canvas> 
    <TextBlock Name="textblock"></TextBlock> 
</Canvas> 

Что не так с этим кодом? раскадровка останавливается после 20-50 раундов. Каждый раз другое число

+0

Очень интересная проблема, я обнаружил, что это останавливается, когда моя мышь перемещается над TextBlock. Иногда я получаю 1500. – 2008-11-24 21:18:36

ответ

2

Я считаю, что это связано с тем, что с вашим кодом не существует отношения, созданного между часами анимации Storyboard и Text DependencyProperty TextBlock. если бы я должен был догадаться, я бы сказал, когда Раскадровка собиралась, это было в несколько случайное время из-за загрязнения потоком обновления DependencyProperty (TextBlock.Text - DependencyProperty). Создание такой ассоциации, как показано ниже (или RunTimeline или RunStoryboard будет работать, но показывают альтернативные способы смотреть на это):

public partial class Window1 : Window 
{ 
    Storyboard a = new Storyboard(); 
    StringAnimationUsingKeyFrames timeline = new StringAnimationUsingKeyFrames(); 
    DiscreteStringKeyFrame keyframe = new DiscreteStringKeyFrame(); 

    int i; 

    public Window1() 
    { 
     InitializeComponent(); 

     //RunTimeline(); 
     RunStoryboard(); 
    } 

    private void RunTimeline() 
    { 
     timeline.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(TextBlock.Text)")); 
     timeline.Completed += timeline_Completed; 
     timeline.Duration = new Duration(TimeSpan.FromMilliseconds(10)); 
     textblock.BeginAnimation(TextBlock.TextProperty, timeline); 
    } 

    private void RunStoryboard() 
    { 
     timeline.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(TextBlock.Text)")); 
     a.Children.Add(timeline); 
     a.Completed += a_Completed; 
     a.Duration = new Duration(TimeSpan.FromMilliseconds(10)); 
     a.Begin(textblock); 
    } 

    void timeline_Completed(object sender, EventArgs e) 
    { 
     textblock.Text = (++i).ToString(); 
     textblock.BeginAnimation(TextBlock.TextProperty, timeline); 
    } 

    void a_Completed(object sender, EventArgs e) 
    { 
     textblock.Text = (++i).ToString(); 
     a.Begin(textblock); 
    } 
} 

Это работает для меня, пока я позволил бы ей работать (~ 10 раз дольше это когда-либо брало, чтобы победить иначе).

Tim

Смежные вопросы