Laden...

Einmaliges hinzufügen eines Events für WPF-Anwendung

Letzter Beitrag vor 13 Tagen 5 Posts 214 Views
Einmaliges hinzufügen eines Events für WPF-Anwendung

Hallo allerseits,

bei meinen ersten Spielereien mit Threading und Animationen, habe ich es hingekriegt jedes Event immer und immer wieder erneut aufzurufen. Wie setze ich die Events so, dass sie nur einmalig aufgerufen werden?

Das ist ein Beispiel, wie ich "versucht" habe das Problem zu lösen, aber die Leistung weiterhin nach einigen Sekunden stark eingebrochen ist.

public GameScreen()
{
    GameField.KeyDown -= KeyIsDown;
    GameField.KeyDown += KeyIsDown;

    GameField.KeyUp -= KeyIsUp;
    GameField.KeyUp += KeyIsUp;

    renderPlayer = new EventHandler(Movement);
    CompositionTarget.Rendering -= renderPlayer;
    CompositionTarget.Rendering += renderPlayer;
}

Ich konnte das Problem auf eine Methode runterbrechen, aber ich weiß leider nicht was ich da ändern kann.

public GameScreen()
{
    InitializeComponent();
    this.DataContext = DataContext;
    GameField.Focus();

    Enemy();
}


private void Enemy()
{
    enemyFigure = new Rectangle
    {
        Width = 50,
        Height = 50,
        Fill = new SolidColorBrush(Colors.DarkGreen),
        Stroke = new SolidColorBrush(Colors.DarkGreen),
        StrokeThickness = 5
    };
    Canvas.SetLeft(enemyFigure, 500); 
    Canvas.SetTop(enemyFigure, 50);
    GameField.Children.Add(enemyFigure);

    renderingEnemy = new EventHandler(OnRender);
    CompositionTarget.Rendering -= renderingEnemy;
    CompositionTarget.Rendering += renderingEnemy;

}

Du arbeitest mit einer vergleichsweise komplexen Technologie. WPF ist nicht einsteigerfreundlich. Du wirst mit einem Try-and-Error Vorgehen echt nich weit kommen und immer wieder - wie hier - an Workarounds viel Zeit verlieren.

Wieso gehst Du nicht sturkturiert an die Sache?


 renderingEnemy = new EventHandler(OnRender);
    CompositionTarget.Rendering -= renderingEnemy;
    CompositionTarget.Rendering += renderingEnemy;

Was Du hier machst ist ein neues Objekt zu erstellen, das zu de-registrieren (was niemals passieren kann) und dann zu registrieren.

Womöglich willst Du die alte Referenz deregistrieren.

private void Enemy()
{
    if(enemyFigure is not null) 
    {
       CompositionTarget.Rendering -= renderingEnemy; // alte Referenz de-registrieren
    }
    
    enemyFigure = new Rectangle
    {
        ...
    };
    ...

    renderingEnemy = new EventHandler(OnRender); // neue Referenz erstellen
    CompositionTarget.Rendering += renderingEnemy; // neue Referenz registrieren
}

Zitat von Abt

Du arbeitest mit einer vergleichsweise komplexen Technologie. WPF ist nicht einsteigerfreundlich. Du wirst mit einem Try-and-Error Vorgehen echt nich weit kommen und immer wieder - wie hier - an Workarounds viel Zeit verlieren.

Wieso gehst Du nicht sturkturiert an die Sache?

Ich weiß ehrlich gesagt nicht wie ich da mit einer Struktur anfangen soll beziehungsweise wo ich anfangen soll.

Weeks of programming can save you hours of planning