C# Wpf Image ändern

abdi-61

Lieutenant
Registriert
Okt. 2011
Beiträge
519
Hi,

ich wollte eine Art Animation in C# darstellen dafür
sollten 3 verschiedene Bilder nacheinander angezeigten werden.
Dies wollte ich so machen das wenn ich die Pfeiltaste unten drücke eine zahl immer
hoch zählt und beim hochzählen ändert sich das Bild.
Doch das funktioniert nicht, kann mir jemand dabei helfen.

Danke im vorraus

Code:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media.Imaging;

namespace bilder
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        BitmapImage bild = new BitmapImage();
        int zeahler = 1;

        public MainWindow()
        {
            InitializeComponent();

            bild.BeginInit();
            bild.UriSource = new Uri("/bilder;component/Images/unten_steh.png", UriKind.Relative);
            bild.EndInit();
            image1.Source = bild;
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Down)
            {
                if (zeahler == 1)
                {
                    Canvas.SetTop(image1, Canvas.GetTop(image1) + 5);
                    
                    bild.UriSource = new Uri("/bilder;component/Images/unten_steh.png", UriKind.Relative);
                    image1.Source = bild;

                    zeahler = 2;
                }
                else if (zeahler == 2)
                {
                    Canvas.SetTop(image1, Canvas.GetTop(image1) + 5);
                    
                    bild.UriSource = new Uri("/bilder;component/Images/unten_lauf_1.png", UriKind.Relative);
                    image1.Source = bild;

                    zeahler = 3;
                }
                else if (zeahler == 3)
                {
                    Canvas.SetTop(image1, Canvas.GetTop(image1) + 5);

                    bild.UriSource = new Uri("/bilder;component/Images/unten_steh.png", UriKind.Relative);
                    image1.Source = bild;

                    zeahler = 4;
                }
                else if (zeahler == 4)
                {
                    Canvas.SetTop(image1, Canvas.GetTop(image1) + 5);

                    bild.UriSource = new Uri("/bilder;component/Images/unten_lauf_2.png", UriKind.Relative);
                    image1.Source = bild;

                    zeahler = 1;
                }
            }      
        }
    }
}
 
evtl. jedes mal ein neues BitmapImage erstellen?

Code:
image1.Source = new BitmapImage(new Uri("/bilder;component/Images/unten_steh.png", UriKind.Relative));
 
Wenn du ein BitmapImage verändern willst, musst du vorher BeginInit() aufrufen, und danach EndInit().
Ansonsten werden alle Änderungen ignoriert.

Konkret würde das bei dir das bedeuten:
Code:
bild.BeginInit();
bild.UriSource = new Uri("/bilder;component/Images/unten_lauf_1.png", UriKind.Relative);
bild.EndInit();
Wobei bei dir die Zeile 1 und 3 fehlen.

Generell ist dein Ansatz aber keine gute Idee, da du jedesmal das Bild neu in den Speicher lädst.
Besser wäre du lädst die Bilder nur einmal und veränderst dann nur immer die Quelle deines Image, ungefähr so:
Code:
BitmapImage[] images =
{
    new BitmapImage(new Uri("bild1")),
    new BitmapImage(new Uri("bild2"))            
};

int idx = 0;

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Down)
    {                
        image1.Source = images[idx];
        idx = (idx + 1) % images.Length;
    }
}


Oder du speicherst deine Animationen einfach als GIF.
Es gibt schon fertige Libraries, die den Umgang mit GIFs sehr einfach machen, z.B. das WPF Animated GIF
 
erstmal danke hab es nun versucht mit Grantig Version doch leider kommt wieder ein Fehler:

Code:
namespace image
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        BitmapImage[] images =
        {
            new BitmapImage(new Uri("unten_steh.png")),
            new BitmapImage(new Uri("unten_lauf_1.png")),
            new BitmapImage(new Uri("unten_lauf_2.png"))       
        };

        

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Down)
            {
                image1.Source = images[0];
            }
        }
    }
}

die Fehlermeldung:



wenn ich das mit dem
Code:
BitmapImage[] images =
        {
            new BitmapImage(new Uri("unten_steh.png")),
            new BitmapImage(new Uri("unten_lauf_1.png")),
            new BitmapImage(new Uri("unten_lauf_2.png"))       
        };

lösche funktioniert es....
 
Du hast auch die Uri falsch angegeben.
Außerdem nimmst du mit images[0] immer nur das erste BitmapImage aus dem Array.
Du musst den Index schon mitzählen so wie ichs im Beispiel geschrieben habe, sonst hast du immer nur das selbe Bild.
 
Das Problem ist ja das, dass Programm gar nicht startet:
hab den Uri nun:

Code:
BitmapImage[] images =
        {
            new BitmapImage(new Uri("unten_steh")),
            new BitmapImage(new Uri("unten_lauf_1")),
            new BitmapImage(new Uri("unten_lauf_2")),
       
        };

trotzdem funktioniert es nicht.
Beim Debuggen erkennt man das, dass Problem hier auftaucht.

Code:
public MainWindow()
        {
            InitializeComponent();
        }

gibt es nicht eine einfachere Lösung, kann doch nicht sein das man für so was einfaches so ein Aufwand betrieben muss.
 
Die Uris sind immernoch falsch. Du hattest die doch schon richtig.
So müssen die aussehen:
Code:
new Uri("/bilder;component/Images/unten_lauf_1.png", UriKind.Relative)

Du solltest erstmal die Grundlagen lernen.
Solange du die nicht beherrschst, und dir alles vorkauen lässt, wird das nix.
Ich hab dir in Post #3 die komplette Lösung hingeschrieben. Du musst nur noch deine Uris einfügen.
Wenn du nichtmal das selbstständig hinbekommst, dann siehts duster aus.

Hier gibts ein online Buch das nen brauchbaren Einstieg ermöglicht: Galileo OpenBook C#
 
Zuletzt bearbeitet:
Ah jetzt hab ich es Danke naja das Problem war das du bei deinem 3. Post

Code:
BitmapImage[] images =
{
    new BitmapImage(new Uri("bild1")),
    new BitmapImage(new Uri("bild2"))            
};

ich dachte man muss nach dem Pfad nicht mehr "UriKind.Relative eingeben"
 
Zurück
Oben