Vektor Grafik/SVG in einer Windows Forms Anwendung [VB.NET 2010]

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Sonorpearl.

    Vektor Grafik/SVG in einer Windows Forms Anwendung [VB.NET 2010]

    HeyHo liebe VB-Community,

    ich suche nach einer Möglichkeit SVG Dateien nativ (oder mit einfacher Konvertierung in ein anderes Format das trotzdem skalierbar ist),
    in einer Windows Forms Anwendung anzeigen zu lassen.

    Nach einiger Versuchszeit habe ich folgende Dinge ausprobiert:

    - sharpvectors.codeplex.com/
    Versucht die Sharpvector Library einzubinden, leider sind die Beispiele in C# und die Portierung von komplett eigenen Librarys mit Vererbung von Events etc. in .NET ist für mich nahezu unmöglich.

    - Ein Web-Browser-Element eingebunden und dort die SVG als Webseite geladen.
    Dabei ist das Problem das, dieses Objekt nicht Transparent ist. Und das weiterleiten von Events wie z.B. dem Anklicken um einen "Knopf" daraus zu machen, gestaltet sich auch als zu schwierig.

    - Über den SVG Viewer (adobe.com/devnet/svg/adobe-svg-viewer-download-area.html) die SVG in einem Control anzeigen zu lassen,
    Hier mal ein Beispiel in C#, das anscheinend nicht mehr mit der aktuellen Version funktioniert: (mecxpert.de/svg/SvgDotNet3beta.html)

    - Ein WPF-Element nach diesen VB Beispielen erstellt (sharpvectors.codeplex.com/Sour…arpVectorsControlSamples/),
    das WPF-Element kann SVG-Dateien laden. Dieses muss jetzt nur noch in einer Windows Forms Anwendung gehostet werden.

    Folgende Möglichkeiten habe ich noch gefunden:

    - Einbinden der SVG Rendering Engine (svg.codeplex.com/)
    - Einbinden eines anderen Browser-Elementes wie z.B. Gecko code.google.com/p/geckofx/

    Diese Elemente müssten sich dennoch in eine simple .NET Windows Forms Anwendung migrieren/importieren lassen, oder?

    Es wäre sehr gut, wenn mir jemand den Weg dahin zeigen könnte oder sogar und ich weiß das es hier nicht gerne gesehen ist,
    ein Beispiel zu erstellen das eine SVG-Datei darstellt und diese Knopf-Funktionalitäten besitzt und Transparent ist. In VB.NET 2010.

    Mit freundlichen Grüßen
    Jan aka. Sonorpearl

    Dieser Beitrag wurde bereits 12 mal editiert, zuletzt von „Sonorpearl“ ()

    ichduersie schrieb:

    Die Lösung steht immer noch in meiner obigen Antwort ;)


    Und du hast kein Stück meinen Beitrag richtig durchgelesen, nachdem er bearbeitet wurde. Hast dir nicht im Ansatz die Klassen und Beispiele angekuckt. Da es nicht einfach nur um ein paar Arrays und Funktionen geht, sondern um Zugriff auf interne Komponenten, Vererbungen von Events und dem Aufbau einer kompletten Library in C#, das nicht einfach abzutun ist mit, C# mimimi, ist genau das gleiche wie VB. Klar kann ichs grundsätzlich verstehen, aber nicht den Kern der Komponente, wenns so einfach wäre, hätte es jemand schon längst veröffentlicht. Es ist ein komplexes Thema. Und solch Leute wie dich sollte aus diesen Forum entgültig entfernt werden.

    Bitte die Off-Topic Kommentare entfernen.

    Sonorpearl schrieb:

    Kern der Komponente

    Hättest du dir den verlinkten Beitrag durchgelesen hättest du verstanden das der Kern der Komponente eben genau das gleiche ist, namentlich IL-Code !

    ichduersie schrieb:

    Warum die Ausrede "Das ist aber C#" nicht gilt


    Nur weil eine Library in C# ist heißt es nicht das du sie nicht mit vb.net ansprechen kannst!

    Evlt auch noch hilfreich für dich: VisualStudio richtig nutzen (Google ist nicht deine Mami)

    Dokta schrieb:


    Nur weil eine Library in C# ist heißt es nicht das du sie nicht mit vb.net ansprechen kannst!


    Die Library ist uralt. Und ich habe sie versucht mit dem letzten Verfügbaren Stand (SVGViewer) einzubinden. Komplett in C#, was nicht mal geklappt hat. Daher müsste sie nicht nur genutzt, sondern erweitert oder gefixxt werden. Aber die grundlagen sollten dem, der sich mit dem Thema länger beschäftigt und sehr gut C# kann, eigentlich kein Problem sein.

    Warum hat sich bislang eigentlich noch keiner mit dem Thema befasst oder etwas in VB.NET geschrieben das man Vektor Grafiken einbinden kann oo?

    Sonorpearl schrieb:

    Komplett in C#, was nicht mal geklappt hat.
    Was genau hat nicht geklappt?
    Arbeitest Du mit Framework 4 und die DLL ist für Framework 2?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Sonorpearl schrieb:

    Komplett in C#, was nicht mal geklappt hat.
    Was genau hat nicht geklappt?
    Arbeitest Du mit Framework 4 und die DLL ist für Framework 2?


    Ich habe die Standard Dokumentation von dem SharpVectors befolg, gab keinen Error. Als ich jedoch eine SVG einbinden wollte, wurde sie nicht gerendert. Selbst das Beispiel das sie vorgegeben hatten, funktionierte nicht mehr. Sie hatten aber auch einen alten Stand der Adobe Librarys die jetzt nicht mehr verfügbar ist.

    Ich denke aber über die SVGViewer Library SVGs einzubinden ist der falsche Weg. Daher ein anderer Ansatz:
    --
    Ich bin derzeit dabei ein XAML SVGCanvas (SharpVectors) zu erstellen und dies dann in eine Windows Forms Application einzubinden.
    Das klappt auch nun soweit, jetzt muss ich nur noch herausfinden, an welcher Stelle Resized werden muss oder ob ich den Renderer.SVGCanvas noch erweitern muss.
    (Hier der Source des Renderer über den ich Spreche: sharpvectors.codeplex.com/SourceControl/latest)

    Ich habe den Kommentar gefunden, weiß aber noch nicht was ich damit anfangen kann.
    "I Wrapped the SVGcanvas into viewbox and used stretch property of the viewbox and everything worked as expected."

    Ich möchte die SVG nun einfach immer full-sized gestrecht haben. (An das ElementHost angepasst)

    Hier mal der erste Stand (Noch nicht schön formatiert und komplett "hingeklatscht"):
    Dateien
    • VBFormsSVG.zip

      (472,64 kB, 199 mal heruntergeladen, zuletzt: )

    Sonorpearl schrieb:

    XAML
    Es gibt in WinForms ein WPF-Interoperability-Control.
    Pack mal Dein Control da rein.

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Sonorpearl schrieb:

    Ich bin derzeit dabei ein XAML SVGCanvas (SharpVectors) zu erstellen und dies dann in eine Windows Forms Application einzubinden.
    Das klappt auch nun soweit


    RodFromGermany schrieb:

    Es gibt in WinForms ein WPF-Interoperability-Control.
    Pack mal Dein Control da rein.


    Das hatte ich ja schon längst gemacht gehabt, wie ich auch geschrieben hatte.
    Nur hatte ich nicht das Element genommen, sondern direkt im Code geschrieben:

    VB.NET-Quellcode

    1. Dim elhost As ElementHost = New ElementHost()
    2. elhost.Dock = DockStyle.Fill
    3. Dim wpfctl As UserControl1 = New UserControl1()
    4. elhost.Child = wpfctl
    5. elhost.AutoSize = True
    6. Controls.Add(elhost)

    Das hier ist mein UserControl1:

    VB.NET-Quellcode

    1. <UserControl x:Class="UserControl1"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    6. xmlns:svgc="http://sharpvectors.codeplex.com/svgc/">
    7. <Grid>
    8. <svgc:SvgCanvas Source="\SubFolder\test.svg" AutoSize="True"/>
    9. </Grid>
    10. </UserControl>

    Und das Beispiel habe ich ja angehängt. Ich schaue gleich mal weiter wie ich das Resize-Problem löse.
    Denn das SVG Bild passt sich nicht dem Control/Fenster/Element-Host an. Sondern bleibt immer klein. Obwohl ich schon überall versucht habe width/height etc. einzustellen.

    Hat sonst noch jemand dazu eine Idee?
    Oder vllt. eine Idee was der eine aus meinte mit dem Kommentar:
    "I Wrapped the SVGcanvas into viewbox and used stretch property of the viewbox and everything worked as expected."

    Unten ist nochmal das Projekt angehängt, wäre gut wenn jeder die Ideen mal vorher testet.
    Und die SVGCanvas-Klasse.
    Dateien
    • VBFormsSVG.zip

      (472,64 kB, 207 mal heruntergeladen, zuletzt: )
    • SvgCanvas.cs

      (15,82 kB, 255 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sonorpearl“ ()

    Sonorpearl schrieb:

    sondern direkt im Code geschrieben
    Das würde ich mal nicht tun.
    Von WPF habe ich allerdings keine Ahnung, so dass ich Dich hier allein lassen muss.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Sonorpearl schrieb:

    sondern direkt im Code geschrieben
    Das würde ich mal nicht tun.
    Von WPF habe ich allerdings keine Ahnung, so dass ich Dich hier allein lassen muss.


    Jo kein Ding, hattest ja wenigstens versucht was zu machen. :D
    Btw. ich glaube aber nicht das man etwas an WPF-Stelle ändern müsste. Sondern vielmehr in der SvgCanvas.cs, die für mich noch etwas zu unverständlich ist, oder in VB.NET.
    WPF kann von Haus aus Pfade anzeigen (= Vektorgrafiken). Wieso willst du das eigentlich machen? WinForms basiert auf Rastergrafiken. Egal, so einfach geht das:

    VB.NET-Quellcode

    1. Dim viewBox = New Viewbox()
    2. Dim path = New Path()
    3. path.Fill = Brushes.Black
    4. path.Data = Geometry.Parse("M27.25,3.125h-22c-1.104,0-2,0.896-2,2v22c0,1.104,0.896,2,2,2h22c1.104,0,2-0.896,2-2v-22C29.25,4.021,28.354,3.125,27.25,3.125zM11.219,26.781h-4v-14h4V26.781zM9.219,11.281c-1.383,0-2.5-1.119-2.5-2.5s1.117-2.5,2.5-2.5s2.5,1.119,2.5,2.5S10.602,11.281,9.219,11.281zM25.219,26.781h-4v-8.5c0-0.4-0.403-1.055-0.687-1.213c-0.375-0.211-1.261-0.229-1.665-0.034l-1.648,0.793v8.954h-4v-14h4v0.614c1.583-0.723,3.78-0.652,5.27,0.184c1.582,0.886,2.73,2.864,2.73,4.702V26.781z")
    5. viewBox.Child = path
    6. ElementHost1.Child = viewBox


    Den Pfad bekommst du entweder direkt von den Seiten (zB hier: raphaeljs.com/icons/#linkedin ) oder du kannst ihn aus allen Formaten mit dem Adobe Illustrator extrahieren, einfach dieses Plugin dafür nutzen:
    mikeswanson.com/xamlexport/ (Es gibt bestimmt auch weiter Möglichkeiten, einfach mal ​Svg to xaml suchen)
    Mfg
    Vincent

    Ich habe ein riesiges WinForms Programm und möchte die vorhanden Grafiken mit SVG Grafiken austauschen. Die SVG Grafiken, damals mit Illustrator erstellt, könnte ich in das von dir genannte Format formatieren.

    Hat sich in deinem Code ein kleiner Fehler eingeschlichen?
    Anders gefragt welche Imports benötigt man, denn bei mir erscheint der Fehler: Der Wert vom Typ "System.Drawing.Brush" kann nicht in "System.Windows.Media.Brush" konvertiert werden.
    Imports System.Windows.Controls
    Imports System.Windows.Media.Brush
    Imports System.Windows.Media

    Sonorpearl schrieb:

    ​Hat sich in deinem Code ein kleiner Fehler eingeschlichen?

    Nö.

    VB.NET-Quellcode

    1. ​Imports System.Windows.Controls
    2. Imports System.Windows.Media
    3. Imports System.Windows.Shapes
    Mfg
    Vincent

    Danke VincentTB,

    das ist schonmal eine gute "Not"-Lösung. Für die meisten wahrscheinlich die Lösung, wenn sie etwas vergleichbares brauchen.
    Ich habe eine klare, vorgegebene Struktur was Grafiken betrifft und ich erstelle sie nicht selbst.

    Man könnte nur alle SVG Dateien in XAML Konvertieren, dieser Prozess muss dann aber jedesmal wiederholt werden, falls es ein Update einer Grafik gibt.
    Daher wären externe SVG Dateien mir viel lieber. Bei meinem letzten Stand, siehe ein paar Posts hier drüber, fehlte ja lediglich nur noch das "Resizen" der reingeladenen SVG-Datei.
    Vllt. hat jemand noch eine Idee wie man das lösen könnte. Ich schaue auch noch mal nach.
    Wie viele Grafiken sind das denn?! Mache ich bei meinen Projekten auch so, es gibt eine Datei, welche die ganzen Pfade speichert und diese können dann immer abgerufen werden. Die Datei musst du ja auch ersetzten, so viel Arbeit ist das nicht und du brauchst nicht 10000 Dateien in dein Projekt einbinden: github.com/Anapher/Hurricane/b…urces/VectorGraphics.xaml

    Für alles andere musst du dann halt immer eine externe Bibliothek mitliefern und das ganze ist noch langsamer. Vektorgrafiken sind ja gegenüber Rastergrafiken schon langsamer, aber dann muss der ja erstmal die Datei einlesen und den Pfad extrahieren.
    Mfg
    Vincent

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VincentTB“ ()

    Ingesamt sind das 700 verfügbare Grafiken, die vorhanden sein müssten. Und bislang wurden sie in anderen Sprachen z.b. Adobe Air, immer als SVG eingebunden. Und es gibt einen klaren Resourcen Ordner, den man dann einfach mit dem Stand auf dem Server ersetzen kann.

    Die meisten Grafiken werden Knöpfe sein, manche aber auch Logos, oder reine Anzeige-Bildchen.
    Da hinter manchen Knöpfchen sogar eine Logik steckt, würde es schon Zeit beanspruchen.
    Wie gesagt, wenn man es nicht anders lösen kann, dann muss ich es so machen. Aber am einfachsen wäre es für mich, wenn man die SVGs einarbeiten könnte. ^^