Hi an alle.
Mein Problem mal kurz beschrieben.
Ich habe** mehrere **Images (unterschiedliche Anzahl) auf einer WPF-Seite mit jeweils dem gleichen Contexmenü.
<Image Name="Bild_1"> // Bild_2 / Bild_3 / usw ....
<Image.ContextMenu>
<ContextMenu Name="cm">
<MenuItem Name="Neu" Header="Neues Bild" Click="Bild_Click">
......
</MenuItem>
<Separator />
<MenuItem Name="Loeschen" Header="Bild löschen" Click="Bild_löschen_Click">
</MenuItem>
</ContextMenu>
</Image.ContextMenu>
</Image>
Dazu meine Frage: Ich brauche den Image-Name, von dem gerade benutzten Image (Name="Bild_1").
Die Abrage mit dem MenuItem geht. ich bräucte aber sowas wie
sender as IMAGE oder (Image)sender
private void Bild_Click(object sender, RoutedEventArgs e) // hier bräuchte ich das Image als sender und nicht das MenuItem
{
MenuItem MN = sender as MenuItem;
string MenuSender = MN.Name;
txtTest.Text = MenuSender;
string message = "Sender: " + sender + "\n";
message += "Source: " + e.Source + "\n";
message += "OriginalSource: " + e.OriginalSource + "\n";
listBox1.Items.Add(message);
}
Irgendwie finde ich per Google nix, bzw mir fällt kein vernünftiger Suchbegriff mehr ein dazu.
Ich hoffe einer von euch kann mir auf die Sprünge helfen.
Danke im voraus
Bernd
Hi,
Parent hat er, hatte ich auch schon mal ausprobiert
MenuItem MN = sender as MenuItem;
string MenuSender = MN.Parent.ToString();
listBox1.Items.Add(MenuSender);
dann kommt dieses als Ergebnis
System.Windows.Controls.ContexMenu.Items.Count:3
Nur was die Count:3 bedeutet, bzw wie ich da auf das Image komme ... ???
Gruß
Bernd
In dem Fall ist das das ContextMenu mit 2x MenuItem und 1x Separator.
Du könntest mit MVVM arbeiten, dem MenuItem einen Command zuweisen und als CommandParameter den Namen des Images verwenden.
Servus,
wenn du es so löst warum willst du dann vom MenuItem überhaupt den Namen haben?
Du landest doch im passendem Event, da weißt du doch schon von welchem MenuItem du kommst und kannst den Namen einfach fest hinterlegen.
Grüße
Danke,
denke damit gehts 😉
<MenuItem Name="Test" Header="Neues Bild" Click="MenuItem_Click">
<MenuItem.CommandParameter>Lichtbild</MenuItem.CommandParameter>
</MenuItem>
MenuItem MN = sender as MenuItem;
string MenuSender = MN.CommandParameter.ToString();
listBox1.Items.Add(MenuSender);
Ihr / Du seit die besten
Danke
Bernd
@ _Cashisclay
Ich will nicht den Namen des Contexmenüs / MenuItems, sondern von dem Bild, das ich angeklickt habe mit dem Menü.
Bernd
Ich würde mal tippen, dass der Name des Bildes wichtig ist, weil viele Bilder das selbe Click-Event bekommen haben.
Wobei pinki's Einwurf mit den MVVM um einiges schöner ist in der Umsetzung
Servus,
wenn es dir egal ist ob dein Image Bild1 heißt oder dein ContextMenu Bild1 dann könntest du es auch so machen :
Dim Source AS FrameworkElement = TryCast(e.Source, FrameworkElement)
Dim ContextMenu AS ContextMenu = CType(Source.Parent, ContextMenu)
ContextMenu.Name
Grüße
Hallo,
jetzt habe ich doch ein anderes Problemchen.
Meine Funktion fürs Bild laden (wo ich den Namen brauche)
private void image_load(Image ImageSender)
{
// Bild laden .....
ImageSender.Source = imageSource;
}
Aufruf 1 geht
image_load(bild);
Aufruf 2 geht nicht
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
MenuItem MN = sender as MenuItem;
string ImageSender = MN.CommandParameter.ToString();
image_load(ImageSender);
}
.... weil string und Image nicht zusammenpassen. Kann man das konventieren?
Oder gibt es eine andere Lösung in meiner image_load() ?
Gruß
Bernd
@ _Cashisclay
Grundsätzlich wäre es mir egal.
Aber leider muss das Image den Namen haben (Name darf nur einmal ja vergeben werden.). siehe meine "image_load()" Aufruf.
Bernd
Den Namen brauchst du doch gar nicht.
Was du brauchst, ist das Image (siehe deine Methode!).
Wenn du auf ein MenuItem klickst, dann ist der Sender das MenuItem. Der Parent ist das ContextMenu. Und der Parent vom ContextMenu wiederum müsste das Image sein...
Wobei es schon sehr frickelig aussieht, was du da machst.
EDIT sagt noch:
...weil string und Image nicht zusammenpassen. Kann man das konventieren?
Die Frage deutet darauf hin, dass dir einige Grundlagen fehlen.
[FAQ] Wie finde ich den Einstieg in C#?
@ p!lle
...weil String und Image nicht zusammenpassen. Kann man das konvenieren?
Dann definiere es das mal anders:
War die Feststellung warum es nicht geht
...weil String und Image nicht zusammenpassen
Kann man das konvenieren?
Neu: Denke mal das Image und String zu unterschiedlich sind, geht ein Konvenieren nicht.
PS: Es ist schön hier jedesmal zu lesen, Wenn jemand eine Frage/Problem hat, das im sofort alle Grundlagen des Programmierens abgesprochen wird.
Wenn niemand ein Problem / Frage hätte, bräuchte man dieses Forum auch nicht.
Und ich weis, ich habe irgendwo einen Denkfehler bei meinem Problemchen, sonst hätte ich hier auch nicht gefragt.
Und mehr werde ich dazu auch nicht mehr kommentieren.
Bernd
Den ersten Teil meiner Antwort zu deinem Problem hast du ja sicher auch gelesen. =)
Und - sei mir nicht böse - wenn so eine Frage gestellt wird, dann darf man das gerne mal hinterfragen.
Gut, war doof formuliert von mir ......
Und mir gefällt das Parent ... Parent ... usw auch nicht, deswegen such ich ja jetzt nach einer anderen Möglichkeit.
1 wüsste ich: Pro Image den ganzen Code hinschreiben, wo jetzt in der image_load() ist .....
nur das will ich ja nicht, das ich zigfach den gleichen Code drin habe.
Na ja Wochenende ist lang, das ich mir was ausdenke, wie ich das löse.
Bernd
MVVM ist Deine Lösung.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
MenuItem MN = sender as MenuItem;
string ImageSender = MN.CommandParameter.ToString();
image_load(ImageSender);
}
Es wurden ja einige Ansätze genannt was du besser machen kannst und willst. Eine spontane Idee (ungetestet) waär im Xaml bei MenuItem die Tag Eigenschaft einfach frech zu nutzen. Dort in RelativSource Binding mit AncestorTyp auf Image Das ja im Visual Tree weiter oben kommen müsste. Dann würdest das oben mit einem cast machen
var menuItem = sender as MenuItem;
var image = menuItem.Tag as Image;
image_load(image);
Musste probieren, ob das so geht. Die anderen Stichwörter das mit MVVM und enem Command machen, waäre auch eher mein Favourit.
Mit freundlichen Grüßen
lutzeslife
Eine spontane Idee (ungetestet) waär im Xaml bei MenuItem die Tag Eigenschaft einfach frech zu nutzen.
Das ist ja noch frickeliger als die ParentParent-Variante. 😄
Die anderen Stichwörter das mit MVVM und enem Command machen, waäre auch eher mein Favourit.
Würde ich auch empfehlen, das würde es um einiges erleichtern. Siehe dazu [Artikel] MVVM und DataBinding
Weeks of programming can save you hours of planning
Danke an euch alle.
Werde mir das MVVM mal reinziehen ......
Gruß
Bernd