Entwickler-Ecke

Basistechnologien - Bilder in String (WPF)


DasHerz - Mo 30.11.09 13:23
Titel: Bilder in String (WPF)
Hallo zusammen,

zwar gehts es in meiner Frage auch um WPF/XAML aber ich denke man kann es unter Anfängerfrage verbuchen ;)

Kurze Einleitung:
Ich habe ein Hangman-Programm geschrieben, das eigentlich auch geht.
Jetzt will ich den Code vereinfachen/verbessern.
Im Prinzip ist es ganz einfach aufgebaut:
- Man hat die Buchstabenreihe und jeweils auf einen Buchstaben klicken.
- Ist der Buchstabe falsch wird ein "Counter" hochgezählt
- Ist der Buchstabe falsch wird ein "Ncounter" runtergezählt
- Erreichen Counter bzw. Ncounter einen bestimmten Wert, erscheint ein spezifisches Bild.

Hier der Teil meines XAML Codes

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
<Image Name="Fehler1" Source ="Hangman0.png"   Grid.Row="2" Grid.ColumnSpan="3"  Margin="20,25,3,86" Grid.Column="3"  Visibility="Hidden"/>
<Image Name="Fehler2" Source ="Hangman1.png"   Grid.Row="2" Grid.ColumnSpan="3"  Margin="20,25,3,86" Grid.Column="3"  Visibility="Hidden"/>
<Image Name="Fehler3" Source ="Hangman2.png"   Grid.Row="2" Grid.ColumnSpan="3"  Margin="20,25,3,86" Grid.Column="3"  Visibility="Hidden"/>
<Image Name="Fehler4" Source ="Hangman3.png"   Grid.Row="2" Grid.ColumnSpan="3"  Margin="20,25,3,86" Grid.Column="3"  Visibility="Hidden"/>
<Image Name="Fehler5" Source ="Hangman4.png"   Grid.Row="2" Grid.ColumnSpan="3"  Margin="20,25,3,86" Grid.Column="3"  Visibility="Hidden"/>
<Image Name="Fehler6" Source ="Hangman5.png"   Grid.Row="2" Grid.ColumnSpan="3"  Margin="20,25,3,86" Grid.Column="3"  Visibility="Hidden"/>
<Image Name="Fehler7" Source ="Hangman6.png"   Grid.Row="2" Grid.ColumnSpan="3"  Margin="20,25,3,86" Grid.Column="3"  Visibility="Hidden"/>
<Image Name="Gameover" Source="gameover.gif"   Grid.Row="1" Grid.ColumnSpan="10" Margin="20.01,18.676,-10.005,-33.35" Visibility="Hidden" Grid.RowSpan="2" />
<Image Name="Highscore" Source="highscore.gif"              Grid.ColumnSpan="10" Margin="-13,0,21,18"                 Visibility="Hidden" Grid.RowSpan="3" />


Wie ihr seht sind die Bilder voher versteckt und werden dann später erst sichtbar.

Mein alter C# Code sah ungefähr so aus:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
     public void A(object sender, RoutedEventArgs e)
        {
            Letter3.Text = "A";
            ncounter -= 1;
            if (counter == 1)
                Fehler1.Visibility = System.Windows.Visibility.Visible;
            if (counter == 2)
                Fehler2.Visibility = System.Windows.Visibility.Visible;

                      // usw...
             
            if (counter == 8)
                Gameover.Visibility = System.Windows.Visibility.Visible;
            if (ncounter == -8)
                Highscore.Visibility = System.Windows.Visibility.Visible;
            ItemA.IsEnabled = false;
        }


Wie ihr seht ziehmlich unübersichtlich, wenn das bei jedem Buchstaben stehen soll.

Also dachte ich mir, bau ich einen string ein:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  string[] fehlerarray = { "Fehler1""Fehler2""Fehler3""Fehler4""Fehler5""Fehler6""Fehler7" };

//...

  public void A(object sender, RoutedEventArgs e)
        {
            Letter3.Text = "A";
            ncounter -= 1;
            if (counter > 0 && counter < 8)
                fehlerarray[counter].Visibility = System.Windows.Visibility.Visible;
            if (counter == 8)
                Gameover.Visibility = System.Windows.Visibility.Visible;
            if (ncounter == -8)
                Highscore.Visibility = System.Windows.Visibility.Visible;
            ItemA.IsEnabled = false;
        }


Jetzt kommt aber die Fehlermeldung:

'string' does not contain a definition for 'Visibility' and no extension method 'Visibility' accepting a first argument of type 'string' could be found (are you missing a using directive or an assembly reference?)


Wisst ihr wie ich mein Problem lösen kann?
Bzw. versteht ihr was ich erreichen will?

Danke schonmal an dieser Stelle.

Viele Grüße,
DasHerz


Kha - Mo 30.11.09 19:13

:welcome:

Nimm ein einziges Image zur Darstellung. Die Bitmaps lädst du über BitmapImage und speicherst sie in einem Array, bei Bedarf wählst du davon eines aus und weist es der Source-Property des Images zu.


PS: Ich weiß nicht, aber ist WPF nicht ein wenig happig für einen Anfänger :nixweiss: ? Ich würde eigentlich jedem empfehlen, erst einmal mit WinForms anzufangen.


DasHerz - Do 03.12.09 09:55

Hallo, danke für deine Antowrt.

Hab bisschen rumprobiert aber ich scheiter momentan hier:

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Die Bitmaps lädst du über BitmapImage und speicherst sie in einem Array.



ich lade das bitmap also so

C#-Quelltext
1:
2:
3:
4:
BitmapImage Fehler1 = new BitmapImage();
            Fehler1.BeginInit();
            Fehler1.UriSource = new Uri(@"Hangman0.png");
            Fehler1.EndInit();

aber wie speicher ich es dann in einen Array?


Kha - Do 03.12.09 11:23

Ich glaube nicht, dass das hier der richtige Ort ist, um den Umgang mit Arrays zu erlernen :| .
Das gehört zu den absoluten Grundlagen, die dir ein Buch wie Galileos Openbook besser beibringen sollte als ein Forum.