Cursor ändern von Image oder Bitmap

  • WPF

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von r0tzi.

    Cursor ändern von Image oder Bitmap

    Hi,

    ich schreibe das hier ins WPF forum, da ich kein geeignenten code für WPF gefunden habe.

    ich möche folgendes.. ich habe mehrere images auf einer form und ziehe die mit Drag und Drop herum. Leider wird mir das Bild, welches dem image zugeordnet ist nicht am Mauszeier angezeigt.
    Dies ist wohl kein leichtes unterfangen ^^... alle drag und drop beispiele die ich ergoogelt habe, sind entweder "RIESIG" (haufen code, aufwand) oder funktionieren nicht in WPF.
    Ich denke jedoch dass das doch viel einfach gehen muss. ich dachte vllt daran, dann ich das bild was angezeigt wird extrahiere und als cursor vorübergehend anzeige.(also image oder bitmap als cursor anzeige) doch auch da hab ich nichts funktionierendes gefunden :(

    hat wer was oder kann mir helfen?

    Viele Grüße
    Hallo

    Habe ich das richtig verstanden, du willst das der MouseCursor sich in dem Moment wo man ein Bild "dragt" so ändert das der Cursor das Bild ist?
    Merkwürdiges verhalten. Also der normale Cursor soll dabei komplett werg sein und stattdessen das Bild in Miniaturansicht zu sehen sein?

    Oder meinst du das neben dem MouseCursor eine Miniaturansich "mitschwebt"?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    beides eine möglichkeit. ich habe ein beispiel in C# gefunden das ist aber so riesig und ich dachte es gibt was kleineres, was weiss ich, 2-3 subs.. ich denke das bild auslesen und als cursor anzeigen wäre vllt die schnellerer kleinere alternative. ich hab das beispiel mal angehängt.
    Dateien
    • DragDrop.rar

      (287,48 kB, 88 mal heruntergeladen, zuletzt: )
    Hallo

    Also ich finde es hält sich in Grenzen. Dafür das der Code quasi universell einsetzbar ist und du nicht für jedes einzelne Control viel Code benötigst ist es überschaubar.
    Sicher gehts anders auch. Es kommt nur darauf an in wie weit das ganze dann auch universell einsetzbar sein soll. Ich finde es auch gut gelöst. Meine Wahl wäre auch ein Adorner gewesen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    ok, ich habs nun 3-3 stunden versucht das hinzubekommen, aber ich kriegs nicht hin.. ich hab nur ein wrap panel wo ich diese imageboxen verschieben möchte...

    hab alles in vbnet umgeändert und genauso eingefügt wie in dem beispielt... aber er findet in der XAML die Namespaces ned... keine ahnung wieso.. ich geh pennen, mir reichts -.-
    Hallo

    Warum machst du es dir so kompliziert. Wenn ein Code in C# vorhanden ist und der funktioniert kannst du ja ne dll draus machen.

    Hab das gerade probiert. Anbei die dll und ein Projekt. Die dll musst du im Projekt selbst new referenzieren.

    Grüße
    Sascha
    Dateien
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Mach mal STRG + Shift + B
    Dann schieße den Designer ab und lass ihn neu initialisieren.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    geht auch nicht und neu starten brachte auch nichts :(.. hab deine dsachen eingeüfgt und gleich getested... nun kommt der fehler...

    System.Windows.Markup.XamlParseException: "Zeilennummer "1" und Zeilenposition "294" von "Für den Typ "System.Windows.Interop.InteropBitmap" wurde kein übereinstimmender Konstruktor gefunden. Der Typ kann mit der Arguments- oder der FactoryMethod-Direktive erstellt werden."."

    ich lade die Images mit

    VB.NET-Quellcode

    1. Public Function GetFileIcon(Filepath)
    2. If System.IO.File.Exists(Filepath) Then
    3. Using sysicon As System.Drawing.Icon = System.Drawing.Icon.ExtractAssociatedIcon(Filepath)
    4. FileIcon = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(sysicon.Handle, System.Windows.Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions())
    5. End Using
    6. Return FileIcon
    7. Exit Function
    8. End If


    Muss ich nun wieder vorher etwas umformatieren?

    es knallt hier in der ersten Zeile, er erwartet wohl ein image

    VB.NET-Quellcode

    1. Public Overrides Function GetVisualFeedback(ByVal obj As IDataObject) As UIElement
    2. Dim elt As Image = CType(ExtractElement(obj), Image)
    3. elt.Width = 50
    4. elt.Height = 60
    5. elt.Opacity = 0.5
    6. elt.IsHitTestVisible = False
    7. Dim anim As DoubleAnimation = New DoubleAnimation(0.75, New Duration(TimeSpan.FromMilliseconds(500)))
    8. anim.From = 0.25
    9. anim.AutoReverse = True
    10. anim.RepeatBehavior = RepeatBehavior.Forever
    11. elt.BeginAnimation(UIElement.OpacityProperty, anim)
    12. Return elt
    13. End Function

    r0tzi schrieb:

    er erwartet wohl ein image


    Ja logisch. Mein Beispiel ist ja auch auf Images ausgelegt.
    Du musst schon versuchen zumindest das bischen Code zu verstehend. Ausserdem: Wenn er in die Zeile springt, dann fahr doch mal mit der Maus über obj, damit du siehst was denn ankommt.
    Debuggen musst du schon.

    Weiters: Public Function GetFileIcon(Filepath) ist nicht schön. Was gibt die Funktion zurück. Birnen?
    Option Strict Off ist unter Winforms schon ne schlechte Idee, unter WPF ist das noch weniger gut.

    r0tzi schrieb:

    ich hab nur ein wrap panel wo ich diese imageboxen verschieben möchte...

    Imagebox = Image in der WPF.
    Und genau auf das habe ich mein Beispiel ausgelegt. Ein WrapPanel gefüllt mit Image-Controls.
    Wenn du etwas anderes in deinem WrapPanel hast musst du das Beispiel eben anpassen. Aber das siehst du eh wenn du beim Debuggen über das obj fährst.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Du hast da nen wurm drinnen. Vermutlich einen falschen Import und willst nicht in Control.Image sondern in Drawing.Image parsen.
    Wenn du selbst nicht debuggen willst/kannst, wie wäre es mit der genauen Fehlermeldung?

    Edit: oder du lädst das Projekt hoch.
    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    bei

    VB.NET-Quellcode

    1. Dim elt As Image = CType(ExtractElement(obj), Image)


    kommt:

    System.Windows.Markup.XamlParseException: "Zeilennummer "1" und Zeilenposition "294" von "Für den Typ "System.Windows.Interop.InteropBitmap" wurde kein übereinstimmender Konstruktor gefunden. Der Typ kann mit der Arguments- oder der FactoryMethod-Direktive erstellt werden."." MissingMethodException: Für den Typ "System.Windows.Interop.InteropBitmap" wurde kein Standardkonstruktor gefunden. Der Typ kann mit der Arguments- oder der FactoryMethod-Direktive erstellt werden.

    ich kann das schon debuggen, da steht halt in dem image ist System.Windows.Interop.InteropBitmap und damit kann er nichts anfangen. also muss ich aus dem OBJ das bild herausholen und in ein image umwandeln... das ist doch irgendwas mit bytes und so kram wovon ich null plan habe -.-

    und der designer spinnt immernoch.. hab VS zurückgesetzt ... geht trotzdem nicht.. vllt muss ich mal updaten :_/
    Nene, er erwartet ein Image-Control kein Image Objekt. Meine Solution funzt bei dir ja oder?

    Hast du Image Controls in deinem WrapPanel?
    Wenn ja, wie sind diese gebunden?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    nein geht nicht, da er wie oben beschrieben irgendwas mit bitmap meint...

    so lade ich meine images ins wrappanel:

    VB.NET-Quellcode

    1. Dim Imagebox As New Image
    2. Imagebox.Width = 40
    3. Imagebox.Height = 40
    4. Imagebox.Margin = New Thickness(8, 7, 8, 20)
    5. Imagebox.Tag = ("Img000" & Link)
    6. Imagebox.Source = GetFileIcon(Link)
    7. Wrap_Bar.Children.Add(Imagebox)
    8. AddHandler Imagebox.MouseDown, AddressOf StartProgram
    9. AddHandler Imagebox.MouseEnter, AddressOf ShowLink
    10. AddHandler Imagebox.MouseLeave, AddressOf HideLink


    Getfile icon wie schon oben beschrieben ist

    VB.NET-Quellcode

    1. Public Function GetFileIcon(Filepath As String) As ImageSource
    2. If System.IO.File.Exists(Filepath) Then
    3. Using sysicon As System.Drawing.Icon = System.Drawing.Icon.ExtractAssociatedIcon(Filepath)
    4. FileIcon = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(sysicon.Handle, System.Windows.Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions())
    5. End Using
    6. Return FileIcon
    7. Exit Function
    8. End If


    Option strict on mach ich meisstens wenns programm einigermassen fertig ist und dann richte ich das alles :D blöde angewohnheit ja... aber ich möchte schnell erstmal was funktionieren sehen hahahaa
    Hallo

    Kannst du ein Testprojekt hochladen. Das muss ich mir genauer ansehen. In meinem TestApp funzt ja alles Tadellos.
    Vieleicht sehe ich dann auch besser was genau du vorhast.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo

    Weder bin ich da um den Oberlehrer zu spielen noch um unnötig zu kritisieren. Klar, wenn mir was auffällt wo ich mir denke das es falsch ist werde ich es immer ansprechen, aber. .

    Jeder lernt, auch ich, und jeder muss seinen Weg zu Ziel finden. Ob der immer gut ist weis man oft erst zum Schluss. Und wenn nicht, tja, aufstehen und nochmal versuchen.

    Ps: Da es öfters angesprochen wird, auch ich mach das alles nur zum Hobby. Ich bin kein Programmierer und habe nichts Studiert. Genau genommen bin ich Hilfsarbeiter. Nur soviel dazu.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    so du hastes per PM... ja wollts nur sagen.. ihr seid immer so streng :D ach.. um ganz ehrlich zu sein... mir gefällt winforms halt einfach besser... drauf los coden und gut.. das XAML gedöns ach... und binding.. ja is ned so meines... wenns nötig ist okay kann man mal amchen.. aber wie du gleich sehen wirst, hab ich alles hinbekommen auch nahezu ohne bindings :P vltt nicht perfekt... aber denke es kann sich sehen lassen :P

    Nofear23m schrieb:


    Ps: Da es öfters angesprochen wird, auch ich mach das alles nur zum Hobby. Ich bin kein Programmierer und habe nichts Studiert. Genau genommen bin ich Hilfsarbeiter. Nur soviel dazu.


    Aber mit reichlich Kompetenz wie ich im paralleln TabControl-Thread gesehen habe :)

    Wenn du es repariert hast, magst du dann posten, was das Problem war. Nur rein interessehalber...


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.