Laden...

WPF Welches Images als (sender) casten

Erstellt von Wassermann vor 7 Jahren Letzter Beitrag vor 7 Jahren 4.541 Views
W
Wassermann Themenstarter:in
16 Beiträge seit 2010
vor 7 Jahren
WPF Welches Images als (sender) casten

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

J
251 Beiträge seit 2012
vor 7 Jahren

Hat er kein Parent?

W
Wassermann Themenstarter:in
16 Beiträge seit 2010
vor 7 Jahren

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

709 Beiträge seit 2008
vor 7 Jahren

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.

_
277 Beiträge seit 2014
vor 7 Jahren

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

W
Wassermann Themenstarter:in
16 Beiträge seit 2010
vor 7 Jahren

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

W
Wassermann Themenstarter:in
16 Beiträge seit 2010
vor 7 Jahren

@ _Cashisclay

Ich will nicht den Namen des Contexmenüs / MenuItems, sondern von dem Bild, das ich angeklickt habe mit dem Menü.

Bernd

J
251 Beiträge seit 2012
vor 7 Jahren

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

_
277 Beiträge seit 2014
vor 7 Jahren

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

W
Wassermann Themenstarter:in
16 Beiträge seit 2010
vor 7 Jahren

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

W
Wassermann Themenstarter:in
16 Beiträge seit 2010
vor 7 Jahren

@ _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

1.040 Beiträge seit 2007
vor 7 Jahren

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#?

W
Wassermann Themenstarter:in
16 Beiträge seit 2010
vor 7 Jahren

@ 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

1.040 Beiträge seit 2007
vor 7 Jahren

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.

W
Wassermann Themenstarter:in
16 Beiträge seit 2010
vor 7 Jahren

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

16.835 Beiträge seit 2008
vor 7 Jahren

MVVM ist Deine Lösung.

1.040 Beiträge seit 2007
vor 7 Jahren

Warum musst du den Code pro Image hinschreiben? 🤔

L
155 Beiträge seit 2012
vor 7 Jahren
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

1.040 Beiträge seit 2007
vor 7 Jahren

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. 😄

5.658 Beiträge seit 2006
vor 7 Jahren

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

W
Wassermann Themenstarter:in
16 Beiträge seit 2010
vor 7 Jahren

Danke an euch alle.

Werde mir das MVVM mal reinziehen ......

Gruß
Bernd