danke für die info, hab mir diese bereits angesehen die ist für mich einwenig overkill.
Ich möchte ja nur dass der String vom Popup Fenster (welcher in einer TextBox) eingegeben wird zurückkommt. Damit ich diesen verwenden kann im 1. Fenster.
Gibt es da eine Möglichkeit?
---> Lösung gefunden
Fenster 1 -> Objekt an Fenster 2 übergeben.
z.b. bei Label:
im Fenster 1:
add neues_fenster = new add(label1);
neues_fenster.Owner = this;
neues_fenster.WindowStartupLocation = WindowStartupLocation.CenterOwner;
neues_fenster.ShowDialog();
im Fenster 2:
private Label labelFromMainWindow;
public add(Label _label)
{
InitializeComponent();
labelFromMainWindow = _label;
}
Reicht vollkommen für meine Zwecke aus...
Hallo habe ein kleines Projekt:
Fenster 1 -> Zeigt einen Istzustand gewisse Werte
Buttons: Werte hinzufügen, löschen, Ändern
Fenster 2 ->
Dort wird der Wert hinzugefügt, oder geändert
Dh. die Daten müssen von F1 -> F2 gehen und retour.
CODE:
Fenster 1 C#
private void Button_Click(object sender, RoutedEventArgs e)
{
Button but = sender as Button;
TreeViewItem tvi = (TreeViewItem)treeView1.SelectedItem;
switch (but.Name)
{
case "Button_Hinzufügen":
TreeViewItem child = new TreeViewItem();
add hinzufuegen_fenster = new add();
hinzufuegen_fenster.Owner = this;
hinzufuegen_fenster.WindowStartupLocation = WindowStartupLocation.CenterOwner;
hinzufuegen_fenster.ShowDialog();
child.Header = bezeichnung;
tvi.Items.Add(child);
tvi.IsExpanded = true; // expand to show new child element
break;
case "Button_Entfernen":
if (tvi != treeView1.Items.GetItemAt(0)) // remove only if not root
{
((TreeViewItem)tvi.Parent).Items.Remove(tvi);
}
break;
case "Button_Aendern":
tvi.Header = tvi.Header.ToString() + "C";
break;
}
}
Fenster 1 XAML
<DockPanel Name="dockpanelanzeige" LastChildFill="True">
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal">
<Button Name="Button_Hinzufügen" Click="Button_Click" Margin="3">Hinzufügen</Button>
<Button Name="Button_Aendern" Click="Button_Click" Margin="3">Ändern</Button>
<Button Name="Button_Entfernen" Click="Button_Click" Margin="3">Entfernen</Button>
</StackPanel>
<TreeView Name="treeView1">
<TreeViewItem Name="treeViewItem1" Header="Root"/>
</TreeView>
</DockPanel>
Im Fenster 2 C#
public add()
{
InitializeComponent();
}
string bezeichnung;
private void speichern_Click(object sender, RoutedEventArgs e)
{
bezeichnung = textbox_bezeichnung.Text;
Close();
}
Fenster 2 XAML
<DockPanel>
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal">
<Button Name="speichern" Margin="3" Click="speichern_Click">Speichern</Button>
<Button Name="abbrechen" Margin="3" Click="abbrechen_Click">Abbrechen</Button>
</StackPanel>
<StackPanel>
<Label Content="Bezeichnung eingeben:"></Label>
<TextBox Height="23" Name="textbox_bezeichnung" Width="220" />
</StackPanel>
</DockPanel>
Was wäre die simplste herangehensweise dass ich die Variable bezeichnung vom Fenster 1 zu 2 und umgekehrt bekommen?
Danke für Eure Hilfe.
Ahh danke so einfach kann die Lösung sein 😉
Ich baue jetzt nämlich Schritt für Schritt in Richtung Deine Lösung damit ich verstehe und lerne was da passiert ...
Danke für Deine Bemühungen!
Für alle dies auch wissen wollen:
Ordner im Projekt anlegen / Rechtsklick auf Ordner / und unter Visual hinzufügen / Vorhandes Element -> Bilder auswählen.
(Im Projektexplorer)
jo, danke! Ist ziemlich komplex für mein Hirn.
Du eine Frage wenn ich mein Projekt, nur auf variable Namen umstellen möchte welche Punkte muss ich dabei beachten damit es klappt habe es nämlich gerade versucht bekomme aber die Bilder nicht angezeigt.
Die Namen klappt perfekt aber eben die Bilder scheinen nimma auf...
Weil so klappts nicht:
<Grid>
<ListBox Name="listBox" ItemsSource="{Binding}" Height="258" IsSynchronizedWithCurrentItem="true">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image Width="100" Height="100" Source="{Binding Path=Pfad}" />
<TextBlock Text="{Binding Path=Pfad.Segments[3]}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBlock FontWeight="Bold" Height="23" Name="textBox1" Text="{Binding Path=Rasse}" Margin="220,300,150,20" />
</Grid>
public List<Hund> hunderassenliste;
public MainWindow()
{
hunderassenliste = new List<Hund>();
var sUri = "pack://application:,,,/Listbox_Hundv3;component/Hund/";
hunderassenliste.Add(new Hund() { Rasse = "Dogge", Pfad = new Uri(sUri + "dogge.jpg") });
hunderassenliste.Add(new Hund() { Rasse = "Pudel", Pfad = new Uri(sUri + "puddel.jpg") });
InitializeComponent();
/*Damit alle darauf zugreifen können nicht nur Listbox*/
this.DataContext = hunderassenliste;
}
public class Hund
{
private string rasse;
//private string pfad;
public string Rasse
{
get { return rasse; }
set { rasse = value; }
}
/*
public string Pfad
{
get { return pfad; }
set { pfad = value; }
}
*/
public Uri Pfad
{
get;
set;
}
}
Danke.
Danke! Ist echt eine große Hilfe um Uris zu verstehen.
Frage:
Wieso hast du neben der Hundklasse noch weitere gemacht?
Wie MainModel (Wann wird diese aufgerufen?) und ViemodelLocator.
Speziell beim diesem check ich jetzt nicht was der genau in diesem
konrekten Bsp. macht.
Danke.
Geschafft:
IsSynchronizedWithCurrentItem="true"
Jetzt habe nur 1 Zusatzfrage ich habe ja die Pfadangaben zu den Bildern hardcodiert.
Man kann die ja dynamisch einlesen so wie es auch du gemacht hast.
Aber wie und wo verknüpft man nun das Puddel Bild mit dem Objekt Puddel?
Habe es jetzt auf so umgeändert hoffe das ist einigermaßen ok.
Jetzt fehlt nur die automatische Aktualisierung bei anderer Auswahl sonst
steht immer Dogge...
<Grid>
<ListBox Name="listBox" ItemsSource="{Binding}" Height="258">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image Width="100"
Height="100"
Source="{Binding Pfad}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBlock Height="23" Name="textBox1" Text="{Binding Path=Rasse}" Margin="220,300,150,20" />
</Grid>
Fast am Ziel ...
Hallo,
diesen Ansatz kenne ich, hab ich mir auch schon angesehen, ist aber mit meinen derzeitigen Wissen (6. Unterrichtsstunde WPF) noch zu hoch für mich...
Habe es jetzt bereits umgekehrt gelöst:
<Grid>
<StackPanel Margin="5" Name="stackPanel1" >
<Image Source="{Binding Pfad}" Stretch="Fill" Width="120" Height="120" />
<ListBox Name="ListBox"
IsSynchronizedWithCurrentItem="True" Height="186"
ItemsSource="{Binding}"/>
<TextBox Height="23" Name="textBox1"
Text="{Binding Path=Rasse, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</Grid>
Nur andersrum so wie ich es benötige haut das nicht hin.
Ich brauch es dass die Bilder i.d. Listbox sind und der Namen angezeigt wird.
Anbei das Projekt - Wäre super wenn du helfen könntest...
Ja das habe ich gerade gemacht damit ist der Fehler verschwunden.
(Also Hund in eine eigene Klasse gepackt)
Meine XAML sieht nun so aus:
<ListBox x:Name="lstBox" ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type local:Hund}">
<StackPanel>
<TextBlock Margin="3" Text="{Binding Rasse}"/>
<Image Source="{Binding Pfad}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Jetzt habe ich nur noch das Problem dass ich nicht will dass der Name direkt über dem Bild ist sondern nur aufgerufen wird sobald das Bild geklickt wird z.B. am Ende des Fensters ...
Schaffe das finish nicht ganz der Darstellung
-> Es soll eine Listbox mit Bildern geben je nachdem welches Bild
genannt wurde wird die Rasse angezeigt.
Meine XAML:
*hier wird mir ein Fehler ausgegeben das die local:Hund Typ
nicht gefunden wurde
<Window x:Class="Listbox_Hundv3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Listbox_Hundv3"
Title="MainWindow" Height="350" Width="525">
<ListBox x:Name="lstBox">
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type local:Hund}">
<StackPanel>
<Image Source="{Binding Pfad}" />
<TextBlock Margin="3" Text="{Binding Rasse}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Window>
Meine CS Datei:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Listbox_Hundv3
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
List<Hund> hunderassenliste;
public MainWindow()
{
hunderassenliste = new List<Hund>();
hunderassenliste.Add(new Hund() { Rasse = "Dogge" , Pfad ="C:/Users/Acer/Downloads/CustomItemsPanel/CustomItemsPanel/Listbox_Hundv3/Hund/dogge.jpg"});
hunderassenliste.Add(new Hund() { Rasse = "Puddel", Pfad = "C:/Users/Acer/Downloads/CustomItemsPanel/CustomItemsPanel/Listbox_Hundv3/Hund/puddel.jpg" });
InitializeComponent();
/*Damit alle darauf zugreifen können nicht nur Listbox*/
this.DataContext = hunderassenliste;
}
/*Objekt Hund erzeugen*/
public class Hund
{
private string rasse;
private string pfad;
public string Rasse
{
get { return rasse; }
set { rasse = value; }
}
public string Pfad
{
get { return pfad; }
set { pfad = value; }
}
public override string ToString()
{
return Rasse + " " + Pfad;
}
}
private void lstimge_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
}
z.B. das hier schaffe ich - von der Funktion her ok aber ohne Bild:
<Grid>
<StackPanel Margin="5" Name="stackPanel1" >
<ListBox Name="ListBox"
IsSynchronizedWithCurrentItem="True" Height="186"
ItemsSource="{Binding}"/>
<TextBox Height="23" Name="textBox1"
Text="{Binding Path=Rasse, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</Grid>
Mit Bild check ich mich nicht durch...
Danke für die Hilfe
Ich hab es jetzt soweit, dass die Bilder in einer Listbox angezeigt werden:
Meine XAML:
<Window x:Class="Listbox_Hundv2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Listbox_Hundv2"
Title="Custom ItemsPanel" Height="800" Width="300"
WindowStartupLocation="CenterScreen"
>
<Window.Resources>
<Style TargetType="{x:Type ListBox}">
<!-- BOF Formattierung der Daten -->
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Image Source="{Binding Path=UriSource}" Stretch="Fill" Width="120" Height="120" />
</DataTemplate>
</Setter.Value>
</Setter>
<!-- EOF Formattierung -->
<!-- Horizontal deaktiviert -->
<Setter
Property="ScrollViewer.HorizontalScrollBarVisibility"
Value="Disabled"
/>
</Style>
</Window.Resources>
<Window.DataContext>
<ObjectDataProvider ObjectType="{x:Type local:Hundloader}" MethodName="LoadImages" />
</Window.DataContext>
<!-- Content hinzufügen -->
<ListBox ItemsSource="{Binding}" />
</Window>
Meine CS Datei:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace Listbox_Hundv2
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
public static class Hundloader
{
public static List<BitmapImage> LoadImages()
{
List<BitmapImage> hundImages = new List<BitmapImage>();
DirectoryInfo hundordner = new DirectoryInfo(@"..\..\Hund");
foreach (FileInfo hundbilder in hundordner.GetFiles("*.jpg"))
{
Uri uri = new Uri(hundbilder.FullName);
hundImages.Add(new BitmapImage(uri));
}
return hundImages;
}
}
}
Jetzt habe ich ein Problem bei dem ich nicht durchchecke wie kann ich nun bei klick auf gewisses Bild einen Namen anzeigen lassen? (Der von mir definiert wird)
Danke für Eure Hilfe.
Danke!
Mit a) BitmapImage kann ich was anfangen da kann ich ansetzen.
Punkt b) und c) sind mir derzeit noch nicht bekannt da muss ich mich noch einlesen.
Meinst du wäre das dann die einfachste Lösung?
Habe dieses Tutorial gefunden (durch deinen Tipp) Tutorial
Dann sind schon mal die Bilder eingelesen.
Die Namen erhalte ich dann in der Ausgabe durch deinen Tipp (b & c?)
ok das habe ich mir gerade mal angesehen - muss dazu noch googlen um zu sehen was die Dinger machen - soweit sind wir im Stoff noch nicht...
Meine Probleme
a) Wie lese ich Bilder aus einem Ordner ein und zeige die in einer
Liste schön gleichmäßig an (obwohl verschiedene Größen)
Den Namen dazu kann ich wahrscheinlich ohnehin via Index nr hardcodieren...
b) Bilder in List schön formatiert untereinander aus geben
als Liste
c) Bei Klick auf Bild Bildernamen ausgeben
Vielleicht kann man ja auf die einzelnen Bereiche Tipps geben...DANKE!
ps. hoffe ich denke nicht zu kompliziert is ja schon spät...
Hallo,
ich lerne gerade und komme jetzt bei einer Aufgabe nicht weiter.
Aufgabe:
Erstelle eine Listbox und ein Label in WPF.
Die Listbox soll Bilder enthalten wenn man auf das Bild klickt wird der Name des
Bildes im Label angezeigt.
Die Liste muss via Codebehind erstellt werden.
-> Habt Ihr Tipps, Tutorials, Codeschnipsel bei der Hand?
Was habe ich bis jetzt gemacht?
-> Via xaml eine listbox reingezogen + label
<StackPanel>
<ListBox Height="182" HorizontalAlignment="Left" Name="meinelistbox" VerticalAlignment="Top" Width="503" SelectionChanged="listBox1_SelectionChanged" />
<Label Content="Label 1" Height="44" HorizontalAlignment="Left" Name="lblgif" VerticalAlignment="Top" Width="503" />
<Label Content="Label 2" Height="44" HorizontalAlignment="Left" Name="lbl" VerticalAlignment="Top" Width="503" />
</StackPanel>
-> Via Codebehind versucht die Bilder aus Ordner einzulesen.
string[] mda = Directory.GetFiles("E:\\Hund");
ListBox meinelistbox = new ListBox();
meinelistbox.SelectionMode = SelectionMode.Single;
meinelistbox.SelectionChanged += listBox1_SelectionChanged;
... Danke für Eure Hilfe