Forum: PC-Programmierung WPF Image laden ohne XAML


von KidMoritz (Gast)


Lesenswert?

Hallo,

ist es in der Programmierung mit WPF zwingend notwendig die Oberflaeche 
in XAML zu gestalten?
Ein JA oder NEIN reicht mir.
Mir geht es um den untenstehenden Code. (copy-past)
Er sollte mir ein Bild anzeigen.
Das Fenster bleibt jedoch leer.
Was ist falsch?

1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Windows;
6
using System.Windows.Controls;
7
using System.Windows.Data;
8
using System.Windows.Documents;
9
using System.Windows.Input;
10
using System.Windows.Media;
11
using System.Windows.Media.Imaging;
12
using System.Windows.Navigation;
13
using System.Windows.Shapes;
14
15
16
namespace WpfImage_laden3
17
{
18
    /// <summary>
19
    /// Interaktionslogik für Window1.xaml
20
    /// </summary>
21
    public partial class Window1 : Window
22
    {
23
        public Window1()
24
        {
25
            InitializeComponent();
26
27
            Image myImage = new Image();
28
            myImage.Width = 512;
29
30
            BitmapImage bitmap = new BitmapImage();
31
32
            bitmap.BeginInit();
33
34
            bitmap.UriSource = new Uri(@"C:\PIC_0001.png",UriKind.Absolute);
35
            bitmap.DecodePixelWidth = 200;
36
37
            bitmap.EndInit();
38
            myImage.Stretch = Stretch.Fill;
39
            myImage.Source = bitmap;
40
        }
41
    }
42
}


Danke im Voraus?

von Arc N. (arc)


Lesenswert?

KidMoritz schrieb:
> Hallo,
>
> ist es in der Programmierung mit WPF zwingend notwendig die Oberflaeche
> in XAML zu gestalten?
> Ein JA oder NEIN reicht mir.

Nein, macht es aber einfacher
1
   // Minimalbeispiel 
2
     class NewWin : Window {
3
        public NewWin() {
4
            var bi = new BitmapImage();
5
6
            bi.BeginInit();
7
            bi.UriSource = new Uri(@"12345.jpg");
8
            bi.EndInit();
9
10
            var img = new Image();
11
            img.Source = bi;
12
13
            Content = img;
14
        }
15
    }
16
17
    class MainClass {
18
        [STAThread]
19
        public static void Main() {
20
            //var app = new NewApp();
21
            //app.Run();
22
23
            var app = new Application();
24
            app.Run(new NewWin());
25
        }
26
    }

von Oliver R. (superberti)


Lesenswert?

Hi,
> Hallo,
>
> ist es in der Programmierung mit WPF zwingend notwendig die Oberflaeche
> in XAML zu gestalten?
> Ein JA oder NEIN reicht mir.

Nein, muss man nicht zwingend. Allerdings möchte man im Regelfall ja 
auch schon vorher sehen, was man da designt hat. Und weiterhin ergeben 
sich durch die XAML-bedingten Verschachtelungen nicht gerade lesbarer 
und ansprechender Code. WPF möchte ja gerade das Design von der 
Programmlogik trennen, evtl. auch mit dem Hintergedanken, dass die 
Bearbeiter unterschiedliche Personen sind mit jeweils speziellen 
Fähigkeiten.

> Mir geht es um den untenstehenden Code. (copy-past)
> Er sollte mir ein Bild anzeigen.
> Das Fenster bleibt jedoch leer.
> Was ist falsch?
>
[...]
> namespace WpfImage_laden3
> {
>     /// <summary>
>     /// Interaktionslogik für Window1.xaml
>     /// </summary>
>     public partial class Window1 : Window
>     {
>         public Window1()
>         {
>             InitializeComponent();
>
>             Image myImage = new Image();
>             myImage.Width = 512;
>
>             BitmapImage bitmap = new BitmapImage();
>
>             bitmap.BeginInit();
>
>             bitmap.UriSource = new
> Uri(@"C:\PIC_0001.png",UriKind.Absolute);
>             bitmap.DecodePixelWidth = 200;
>
>             bitmap.EndInit();
>             myImage.Stretch = Stretch.Fill;
>             myImage.Source = bitmap;
>         }
>     }
> }

WPF kann mit diesen Zeilen noch nichts anfangen, da es ja gar nicht 
weiß, WO es das Image darstellen soll (in welchem Container). Entferne 
einfach mal das Grid (welches standardmäßig immer auf dem WPF-Fenster 
liegt) und füge am Ende des CTORS folgende Zeile hinzu:

AddChild(myImage);

Natürlich kannst Du Dein Image auch in jedes andere ContentControl 
reinhängen, welches sich auf Deiner Oberfläche befindet. Hast Du wieder 
ein Grid auf dem Fenster und dem Teil einen Namen gegeben (z.B. 
"Grid1"), dann kannst Du den Content des Grids mit

Grid1.Children.Add(myImage);

festlegen.

Gruß, Oliver

von KidMoritz (Gast)


Lesenswert?

Hallo,

vielen Dank fuer die Hinweise und Anregungen.

Ich habe mit beiden CodeSnippets ein wenig hin und her probiert.

>WPF kann mit diesen Zeilen noch nichts anfangen, da es ja gar nicht
>weiß, WO es das Image darstellen soll (in welchem Container).

Macht Sinn ;)
1
Content = myImage;
2
AddChild(myImage);

Beide Ausdruecke bewirken das Selbe.
Worin liegt da der Unterschied?
Mit XAML gaebe es eine weitere Variante zum Erreichen des Ziels.
Es gibt viele Wege zum erreichen eines Zieles.
Warum reicht einer denn nicht aus?



Gruesse KidMoritz

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.