Почему раскадровка WPF останавливается после нескольких циклов? - PullRequest
1 голос
/ 23 июля 2011

У меня есть холст, на котором я рисую прямоугольники и перемещаю их случайным образом с помощью раскадровки.После нескольких циклов событие storyboard.completed больше не срабатывает.Кто-нибудь знает?вот мой xaml:

    <Grid>
        <Canvas Name="movingCanvas" Background="Green" Margin="0,29,0,0"></Canvas>
        <TextBlock Height="23" Name="textBlock1" Text="TextBlock" Margin="528,0,0,538" />
    </Grid>

и код:

 private Random random = new Random();
    private Storyboard gameLoop = new Storyboard();
    private int i = 0;

    public Window3()
    {
        InitializeComponent();
        this.gameLoop.Duration = TimeSpan.FromMilliseconds(100);
        this.gameLoop.Completed += new EventHandler(this.gameLoop_Completed);
        this.gameLoop.Begin();
    }

    private void gameLoop_Completed(object sender, EventArgs e)
    {
        this.addRectangle();
        this.moveRectangle();
        i++;
        this.textBlock1.Text = i.ToString();
        this.gameLoop.Begin();
    }

    private void addRectangle()
    {
        Rectangle rect = new Rectangle();
        rect.Height = 100;
        rect.Width = 100;
        rect.Stroke = new SolidColorBrush(Colors.Black);
        Canvas.SetLeft(rect, random.Next((int)this.Width));
        Canvas.SetTop(rect, random.Next((int)this.Height));
        this.movingCanvas.Children.Add(rect);
    }

    private void moveRectangle()
    {
        foreach (UIElement elm in this.movingCanvas.Children)
        {
            int moveLeft = random.Next(10);
            int distance = random.Next(-10, 20);
            if (moveLeft > 5)
            {
                Canvas.SetTop(elm, Canvas.GetTop(elm) + distance);
            }
            else
            {
                Canvas.SetLeft(elm, Canvas.GetLeft(elm) + distance);
            }
        }
    }

Ответы [ 2 ]

1 голос
/ 23 июля 2011

Событие Completed также не происходит без создания и перемещения прямоугольников:

private Storyboard gameLoop = new Storyboard();    
private int i = 0;    
public Window3()    
{        
    InitializeComponent();        
    this.gameLoop.Duration = TimeSpan.FromMilliseconds(100);        
    this.gameLoop.Completed += new EventHandler(this.gameLoop_Completed);
    this.gameLoop.Begin();    
}    

private void gameLoop_Completed(object sender, EventArgs e)    
{        
    i++;        
    this.textBlock1.Text = i.ToString();        
    this.gameLoop.Begin();    
}

Если вы добавите анимацию в раскадровку, раскадровка не прекратит запуск события.

public Window3()    
{        
    InitializeComponent();        
    this.gameLoop.Duration = TimeSpan.FromMilliseconds(100);        
    this.gameLoop.Completed += new EventHandler(this.gameLoop_Completed);
    DoubleAnimation animation= new DoubleAnimation { From = 100, To = 101 };
    ani.SetValue(Storyboard.TargetProperty, this);
    ani.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("Height"));            
    this.gameLoop.Children.Add(ani);

    this.gameLoop.Begin();    
}    

Как сказал выше Кшитидж Мехта, я думаю, что вместо раскадровки используйте таймер, но, возможно, у вас есть причина использовать раскадровку ....

1 голос
/ 23 июля 2011

Вы действительно хотите добавить новый прямоугольник на каждую итерацию цикла?

Вы очень быстро получите десятки тысяч, если не миллионы прямоугольников, на рисование которых уйдет все больше и больше времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...