Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 8 Min.

Chrome-Lesezeichen anbinden

Nachdem die Objektstruktur für Google-Chrome-Lesezeichen angelegt ist, erweitern Sie die Favoriten des Systems.
© dotnetpro
Der wechselseitige Gebrauch unterschiedlicher Webbrowser gestaltet sich hinsichtlich der darüber verwalteten Favoriten beziehungsweise Lesezeichen als äußerst schwierig. Der Grund: Es gibt kein einheitliches Lesezeichen-Format für alle Webbrowser, und auch wechselseitige Export- und Importfunk­tionen werden nicht bereitgestellt. Dementsprechend müssen Sie sich in eigenen Browser-Anwendungen selbst darum kümmern.In dieser Serie wurde bereits gezeigt, wie Sie ein benutzerdefiniertes Webbrowser-Steuerelement definieren sowie die Favoriten des Systems und des Internet Explorers auslesen, erweitern und über ein benutzerdefiniertes Favoritensteuerelement strukturiert ausgeben (siehe [1] bis [8]). Für die Unterstützung der Chrome-Lesezeichen wurde in [9] bis [11] gezeigt, wie Sie die im JSON-Format verwalteten Lesezeichen in eine Objektstruktur überführen. Diese Objektstruktur vom Typ ChromeBookmarks vereinfacht die Übernahme der Lesezeichen in das Favoritenverzeichnis des Windows-Systems, das auch vom Internet Explorer verwendet wurde.Die Objektstruktur ist in Bild 1 dargestellt. Alle Lesezeichen werden in drei Hauptebenen (roots) verwaltet, wobei jede Hauptebene (root) ihrerseits Lesezeichen (childrens) und untergeordnete Ordnerauflistungen (FolderDatas) enthalten kann. Jeder untergeordnete Ordner (FolderData) besitzt neben Lesezeichen (childrens) wiederum untergeordnete Ordner (SubFolderDatas), die sich erneut aus Lesezeichen und Unterordnern zusammensetzen.
Ausgangspunktfür die Übernahme der Chrome-Lesezeichen ist die benutzerdefinierte Datenstruktur ChromeBookmarks(Bild 1) © Autor
Das Ganze ist in variablen Ebenen möglich. Zu jedem Ordner wird der Name (name), das Anlagedatum (date_added) sowie das letzte Änderungsdatum (date_modified) gespeichert. Lesezeichen werden über Children-Objekte verwaltet, die das Datum des Hinzufügens (date_added), den Namen (name) und insbesondere den URL (url) enthalten.

Chrome-Lesezeichen in Favoriten umwandeln

Die gerade beschriebene Objekthierarchie ist Grundlage für die Übernahme der Chrome-Lesezeichen in das Favoritenverzeichnis. Dazu wird die Objektstruktur in eine Verzeichnisstruktur überführt, die ihrerseits als Unterordner im Favoritenverzeichnis eingerichtet wird. Das Hauptunterverzeichnis entspricht dem Haupteintrag ChromeBookmarks, in dem drei Unterverzeichnisse mit den Hauptknoten (roots) eingerichtet werden (bookmark_bar, synced und other). In den einzelnen Hauptordnern können ein oder mehrere Lesezeichen über entsprechende URL-Dateien angelegt und verwaltet werden. In jedem Ordner sind ein oder mehrere Unterordner enthalten, die ihrerseits URL-Definitionen und weitere Unterordner (mit geschachtelten Ebenen) enthalten können. Die Struktur entspricht der Objekthierarchie ChromeBookmarks (Bild 2).
Die Verzeichnisstrukturzur Objekthierarchie ChromeBookmarks(Bild 2) © Autor

Von der Objekthierarchie zur Verzeichnisstruktur

Alle Importfunktionen für die Chrome-Lesezeichen werden direkt in das Anzeigesteuerelement FavoritesCtl übernommen, das die Favoritenverwaltung in der Benutzeroberfläche vornimmt. Die Importfunktionen finden Sie in der Klasse BrowserFunctions, welche über die nachfolgende Anweisung global in das Benutzersteuerelement eingebunden und instanziert wird:

<span class="hljs-keyword">Dim </span><span class="hljs-keyword">bfObj </span>As New <span class="hljs-keyword">BrowserFunctions </span>
 
Darauf aufbauend realisieren Sie die Importfunktion ImportChromeBookmarks. Darin lesen Sie zunächst die aktuellen Chrome-Bookmarks in die Verzeichnisstruktur ein. Die Objektstruktur zu den Lesezeichen ermitteln Sie über die Methode bfObj.GetBookmarks und übernehmen diese in die Objektvariable cb. Im Anschluss daran übernehmen Sie die eingelesenen Lesezeichen in den Favoritenordner des Systems, indem Sie per For-Each-Schleife alle Hauptordner der roots-Auflistung durchlaufen. Jeder verarbeitete Hauptordner wird dabei an die Methode ImportRoot übergeben, die jeweils nur diesen Hauptordner importiert. Ist das Importieren abgeschlossen, wird die Anzeige mit allen Favoriten über die Methode ShowFavorites neu aufgebaut.

<span class="hljs-keyword">Sub</span> ImportChromeBookmarks() 
  <span class="hljs-keyword">Dim</span> cb <span class="hljs-keyword">As</span> ChromeBookmarks = 
    bfObj.GetBookmarks() 
  <span class="hljs-keyword">With</span> cb 
    <span class="hljs-keyword">For</span> <span class="hljs-keyword">Each</span> MainFolder <span class="hljs-keyword">As</span> Root <span class="hljs-keyword">In</span> .roots 
      ImportRoot(MainFolder) 
    <span class="hljs-keyword">Next</span> 
  <span class="hljs-keyword">End</span> <span class="hljs-keyword">With</span> 
  ShowFavorites() 
<span class="hljs-keyword">End</span> <span class="hljs-keyword">Sub</span> 
 
Die Methode ImportRoot(Listing 1) verarbeitet einen Hauptordner des Typs Root, der per Parameter übergeben wird. Per Definition sind zunächst drei Hauptordner vorgegeben. Im ersten Schritt wird zunächst das Zielverzeichnis für die URL-Dateien bestimmt. Um die Inhalte abzuheben, wird ein eigener Unterordner als Basis eingerichtet, über den alle Importe später komplett wieder zu entfernen, zu sichern und gegebenenfalls zu verschieben sind. Dieser Unterordner trägt den Namen Google Chrome und befindet sich im Favoritenordner, der mit bfObj.GetFavoritesFolder abgefragt wird.
Listing 1: Hauptordner der Chrome-Lesezeichen importieren
Sub ImportRoot(ByVal MainFolder &lt;span class="hljs-keyword"&gt;As&lt;/span&gt; Root) &lt;br/&gt;&lt;br/&gt;  &lt;span class="hljs-keyword"&gt;Dim&lt;/span&gt; MainFavoritesFolder &lt;span class="hljs-keyword"&gt;As&lt;/span&gt; String = &lt;br/&gt;    bfObj.GetFavoritesFolder() &amp;amp; &lt;br/&gt;    &lt;span class="hljs-string"&gt;"\Google Chrome"&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-keyword"&gt;Dim&lt;/span&gt; RootFolderName &lt;span class="hljs-keyword"&gt;As&lt;/span&gt; String = &lt;span class="hljs-string"&gt;""&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-keyword"&gt;Select&lt;/span&gt; &lt;span class="hljs-keyword"&gt;Case&lt;/span&gt; MainFolder.Name &lt;br/&gt;    &lt;span class="hljs-keyword"&gt;Case&lt;/span&gt; &lt;span class="hljs-string"&gt;"bookmark_bar"&lt;/span&gt; &lt;br/&gt;      RootFolderName = &lt;span class="hljs-string"&gt;"Lesezeichen"&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-keyword"&gt;Case&lt;/span&gt; &lt;span class="hljs-string"&gt;"other"&lt;/span&gt; &lt;br/&gt;      RootFolderName = &lt;span class="hljs-string"&gt;"Andere"&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-keyword"&gt;Case&lt;/span&gt; &lt;span class="hljs-string"&gt;"synced"&lt;/span&gt; &lt;br/&gt;      RootFolderName = &lt;span class="hljs-string"&gt;"Synchronisiert"&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-keyword"&gt;Case&lt;/span&gt; &lt;span class="hljs-keyword"&gt;Else&lt;/span&gt; &lt;br/&gt;      'für spätere Erweiterungen unverändert &lt;br/&gt;      ' übernehmen &lt;br/&gt;      RootFolderName = MainFolder.Name &lt;br/&gt;  &lt;span class="hljs-keyword"&gt;End&lt;/span&gt; &lt;span class="hljs-keyword"&gt;Select&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-keyword"&gt;Dim&lt;/span&gt; RootFolder &lt;span class="hljs-keyword"&gt;As&lt;/span&gt; String = &lt;br/&gt;    MainFavoritesFolder &amp;amp; &lt;span class="hljs-string"&gt;"\"&lt;/span&gt; &amp;amp; RootFolderName &lt;br/&gt;  CreateFavoritesFolder(RootFolder) &lt;br/&gt;  ImportFolderDatas( &lt;br/&gt;    RootFolder, MainFolder.FolderDatas) &lt;br/&gt;  ImportChildrens( &lt;br/&gt;    RootFolder, MainFolder.Childrens) &lt;br/&gt;&lt;span class="hljs-keyword"&gt;End&lt;/span&gt; Sub  
Über eine Select-Case-Auswahl werden die von Chrome genutzten root-Bezeichner durch deutsche Namen ersetzt, die dann im Steuerelement angezeigt werden und die ihrerseits als Unterordner über die Methode CreateFavoritesFolder angelegt werden, sofern sie noch nicht vorhanden sind.Im Anschluss daran werden mit ImportFolderDatas die untergeordneten Ordner unter Angabe des jeweiligen Zielordners (RootFolder) und der zugehörigen FolderDatas-Auflistung eingelesen. Die im Hauptordner enthaltenen Lesezeichen werden abschließend mit der Methode ImportChildrens übernommen.Die Methode CreateFavoritesFolder übernimmt einen übergebenen Pfad (Folder) und legt diesen, sofern er noch nicht existiert, mit Directory.CreateDirectory an.

Sub CreateFavoritesFolder(ByVal Folder As String) 

  If Directory.Exists(Folder) = False Then 
    Directory.CreateDirectory(Folder) 
  End If 
End Sub 
Unterverzeichnisse der Hauptordner werden in Chrome zusammen mit dem Anlagedatum und dem Datum der letzten Änderung gespeichert. Und auch zu einzelnen URLs wird ein Anlagedatum abgelegt. 
Darüber ist es später möglich, veraltete URLs und/oder Ordner herauszufiltern beziehungsweise zu löschen oder Ordner und/oder URLs nach Datum zu suchen. Die intern als Zeichenketten verwalteten Chrome-Datumswerte, hinter ­denen sich lange Ganzzahlwerte verbergen, sind allerdings nicht direkt nutzbar und müssen zunächst in entsprechende DateTime-Objekte konvertiert werden. Diese Aufgabe übernimmt die benutzerdefinierte Konvertierfunktion ChromeDate2DateTime. Dieser wird das Chrome-Datum als Zeichenkette übergeben. Die Funktion liefert das Ergebnis als DateTime-Objekt zurück (Listing 2). Die interne Umwandlung wird schrittweise im Quelltext dokumentiert.
Listing 2: Chrome-Datum konvertieren
Function ChromeDate2DateTime( &lt;br/&gt;  ByVal ChromeDate As String) As DateTime &lt;br/&gt;  ' String in Long umwandeln (Millisekunden) &lt;br/&gt;  Dim mSeconds As Long = CLng(ChromeDate / 1000) &lt;br/&gt;  ' Basis zur Zeitangabe (Epoche) &lt;br/&gt;  Dim epoch As DateTime = New DateTime(1601, 1, 1) &lt;br/&gt;  ' Umrechnung in Ticks (dasZehnmillionstel &lt;br/&gt;  ' einer Sekunde) &lt;br/&gt;  Dim epochValue As Long = epoch.Ticks &lt;br/&gt;  ' Umwandeln in UTC-Zeit (Koordinierte Weltzeit) &lt;br/&gt;  Dim utcTime As DateTime = &lt;br/&gt;    New DateTime(epochValue + mSeconds * 10) &lt;br/&gt;  ' Rückgabe in lokalisierter Zeit &lt;br/&gt;  Return utcTime.ToLocalTime &lt;br/&gt;End Function  
ImportFolderDatas erledigt den Import einzelner Datenordnerauflistungen. Der Methode übergeben Sie den Ausgangsordner (Folder) für die Verarbeitung als String sowie die zugehörige FolderDatas-Auflistung (fd), siehe Listing 3.
Listing 3: Datenordner importieren
Sub ImportFolderDatas(ByVal Folder As String, &lt;br/&gt;  ByVal fd As FolderDatas) &lt;br/&gt;&lt;br/&gt;  For Each SubFolder As FolderData In fd &lt;br/&gt;    Dim SubFolderName As String = &lt;br/&gt;      Folder &amp;amp; "\" &amp;amp; SubFolder.name &lt;br/&gt;    CreateFavoritesFolder(SubFolderName) &lt;br/&gt;    Directory.SetCreationTime(SubFolderName, &lt;br/&gt;      ChromeDate2DateTime(SubFolder.date_added)) &lt;br/&gt;    Directory.SetLastWriteTime(SubFolderName, &lt;br/&gt;      ChromeDate2DateTime(SubFolder.date_modified)) &lt;br/&gt;    If SubFolder.SubFolderDatas IsNot Nothing Then &lt;br/&gt;      ImportFolderDatas(SubFolderName, &lt;br/&gt;        SubFolder.SubFolderDatas) &lt;br/&gt;    End If &lt;br/&gt;    ImportChildrens(SubFolderName, &lt;br/&gt;      SubFolder.Childrens) &lt;br/&gt;  Next &lt;br/&gt;End Sub  
In der Methode werden alle FolderData-Elemente der übergebenen FolderDatas-Auflistung über eine For-Each-Schleife durchlaufen. Die Verarbeitung erfolgt dabei verzeichnisbezogen. Der Name des ersten Unterordners wird über die Variable SubFolderName bestimmt, die sich aus den Namen von Haupt- und Unterordner zusammensetzt. Mit CreateFavoritesFolder wird der neue Unterordner, sofern nicht vorhanden, angelegt. Ist der Ordner angelegt, werden das Anlagedatum und das Datum der letzten Änderung entsprechend dem Chrome-Element übernommen. Dazu kommen die Methoden Directory.SetCreationTime (Änderung Anlagedatum) und Directory.SetLastWriteTime (Änderung Datum der letzten Änderung). Die Umwandlung des Chrome-Datumswertes übernimmt dabei jeweils die Funktion ­ChromeDate2DateTime.Finden sich im aktiv verarbeiteten Unterordner (SubFolder) weitere SubFolderDatas-Auflistungen, so werden diese rekursiv verarbeitet. Abschließend wird mit ImportChildrens jeweils die zum aktuell verarbeiteten Unterordner gehörende Lesezeichenauflistung SubFolder.Childrens importiert.Die Methode ImportChildrens dient der Übernahme der in einem Ordner vorhandenen URLs. Der Zielordner wird über den Parameter DestinationFolder, die URL-Auflistung vom Typ Childrens über den Parameter Entries übergeben. Alle Einträge werden erneut per For-Each-Schleife verarbeitet. Mit der Methode CreateChromeBookmarkURL wird ein einzelner URL übernommen, der in einem Ordner (zum Beispiel root) oder beliebigen Unterordnern definiert ist.

Sub ImportChildrens(ByVal DestinationFolder As String, 
  ByVal Entries As Childrens) 
  For Each Entry As Children In Entries 
    CreateChromeBookmarkURL(DestinationFolder, Entry) 
  Next 
End Sub 
 
Das nächste Problem, das an dieser Stelle auftaucht, ist, dass die Namenseigenschaften, die in den Chrome-Lesezeichen verwendet werden, mitunter in Dateinamen unzulässig sind. Die benutzerdefinierte Funktion FilterUnsupportedtFile­Chars ersetzt oder entfernt diese Zeichen. Die Funktion ist ­dabei so aufgebaut, dass sie jedes einzelne unzulässige Zeichen durch ein alternatives, in Dateinamen zulässiges Zeichen ersetzt, siehe Listing 4.
Listing 4: Dateinamen säubern
Function FilterUnsupportedtFileChars( &lt;br/&gt;  ByVal FileName As String) As String &lt;br/&gt;&lt;br/&gt;  Dim fn As String = FileName &lt;br/&gt;  fn = fn.Replace("[", "(") &lt;br/&gt;  fn = fn.Replace("]", ")") &lt;br/&gt;  fn = fn.Replace("\", "") &lt;br/&gt;  fn = fn.Replace("/", "") &lt;br/&gt;  fn = fn.Replace("?", "") &lt;br/&gt;  fn = fn.Replace("*", "") &lt;br/&gt;  fn = fn.Replace("^", "") &lt;br/&gt;  fn = fn.Replace(Chr(34), "") &lt;br/&gt;  fn = fn.Replace("&amp;lt;", "") &lt;br/&gt;  fn = fn.Replace("&amp;gt;", "") &lt;br/&gt;  fn = fn.Replace("]", "") &lt;br/&gt;  fn = fn.Replace("|", "") &lt;br/&gt;  Return fn &lt;br/&gt;End Function  
Einzelne URL-Dateien werden jeweils über die Methode CreateChromeBookmarkURL generiert. Dieser übergeben Sie den Zielordner im Favoritenverzeichnis (Folder) und ein URL-Eintragsobjekt vom Typ Children (c), siehe Listing 5.
Listing 5: URL-Datei zu einem Chrome-Lesezeichen anlegen
Sub CreateChromeBookmarkURL( &lt;br/&gt;  ByVal Folder As String, ByVal c As Children) &lt;br/&gt;&lt;br/&gt;  Dim UrlFileWithPath As String = Folder &amp;amp; "\" &amp;amp; &lt;br/&gt;    FilterUnsupportedtFileChars(c.name) &amp;amp; ".url" &lt;br/&gt;  Dim IconFile As String = &lt;br/&gt;    GetIconPathForGoogleBookmark(c.url) &lt;br/&gt;  Dim IconIndex As Integer = 1 &lt;br/&gt;&lt;br/&gt;  bfObj.CreateUrlShortcut(UrlFileWithPath, &lt;br/&gt;    c.url, IconFile, IconIndex) &lt;br/&gt;  File.SetCreationTime(UrlFileWithPath, &lt;br/&gt;    ChromeDate2DateTime(c.date_added)) &lt;br/&gt;End Sub  
In der Methode wird zunächst der URL-Dateiname samt Pfad in der Variablen UrlFileWithPath zusammengefasst, um dann das Standardsymbol zur Symboldatei über die Funk­tion GetIconPathForGoogleBookmark unter Angabe des zugehörigen URLs (c.url) zuzuordnen. Zur Dateianlage kommt die bereits definierte Methode bfObj.CreateUrlShortcut zum Einsatz. Abschließend wird das Anlagedatum der neu angelegten URL-Datei auf das URL-Anlagedatum des zugehörigen Chrome-Lesezeichens gesetzt. Hierbei kommen die Methoden File.SetCreationTime und ChromeDate2DateTime sowie die Eigenschaft c.date_added zum Einsatz.Standardsymbole zu Domänen können Sie über Google ­abrufen. GetDomainString ist eine Funktion, welche die zu einem URL gehörende Domäne abspaltet und als String zurückliefert. Dazu wird ein URI mit der URL-Adresse angelegt, um den zugehörigen Host über die gleichnamige Eigenschaft abzuspalten und zurückzugeben.

Function GetDomainString(ByVal UrlString As String) 
  Dim uri As Uri = New Uri(UrlString) 
  Return uri.Host 
End Function 
Die Suchadresse zu einem URL-spezifischen Bildsymbol fragen Sie über die Funktion GetIconPathForGoogleBookmark ab, der Sie die URL-Adresse übergeben. Die Funktion gibt die HTTP-Adresse zum Symbol unter Angabe des Domänennamens zurück. Das Ergebnis wird direkt in URL-Dateien übernommen.Chrome selbst weist Lesezeichen nicht direkt ein Bildsymbol zu. Ursprünglich wurde der Rumpf der Funktion GetIconPathForGoogleBookmark in der Klasse BrowserFunctions definiert, nun aber in die Steuerelementklasse FavoritesCtl verschoben.

Function GetIconPathForGoogleBookmark( 
  ByVal UrlString As String) As String 
  Return "http://www.google.com/s2/favicons?domain=" &amp; 
        GetDomainString(UrlString) 
End Function 

Kontextmenü erweitern

Nachdem die Übernahmefunktionen codiert sind, können Sie diese über das Favoritensteuerelement und das zugehörige Symbolleistensteuerelement bereitstellen. Bild 3 zeigt die neuen Kontextmenüdefinitionen im Entwurfsmodus von Visual Studio.
Die neuenImport-und Verwaltungsfunktionen stellt das Steuerelement FavoritesCtl.vb über einerweitertes Kontextmenü bereit(Bild 3) © Autor
Tabelle 1 fasst die Kontextmenü-Methoden, die aufgerufenen Funktionen und deren Beschreibungen zusammen. Die einzelnen Funktionen sollen hier nicht mehr detailliert behandelt werden. Die meisten Funktionen werden zusätzlich über öffentliche Methoden für den externen Aufruf bereitgestellt. Details entnehmen Sie bitte dem Code im Download zum Artikel. So viel für diesmal. In der kommenden Folge dieser Serie geht es weiter mit dem Sichern, Wiederherstellen und Löschen von Favoriten.

Tabelle 1: Neue Kontextmenübefehle im Favoritensteuerelement

Menüereignisprozedur Angebundene bfObj-Methode Öffentliche Methode Funktion
tsmImportChromeBookmarks_Click(...) Handles tsmImportChromeBookmarks.Click ImportChromeBookmarks ImportGoogleChromeBookmarks Chrome Bookmarks importieren
tsmBackupFavorites_Click(...) Handles tsmBackupFavorites.Click BackupFavorites BackupFavorites Alle Favoriten sichern
tsmRestoreFavorites_Click(...) Handles tsmRestoreFavorites.Click RestoreFavorites (mit Anzeigeaktualisierung) RestoreFavorites Gesicherte Favoriten wiederherstellen
tsmBackupChromeFavorites_Click(...) Handles tsmBackupChromeFavorites.Click BackupChromeFavorites BackupChromeFavorites Importierte Chrome-Lesezeichen sichern
tsmRestoreChromeFavorites_Click(...) Handles tsmRestoreChromeFavorites.Click RestoreChromeFavorites(Me) RestoreChromeFavorites Gesicherte Chrome-Favoriten wiederherstellen
tsmDeleteChromeFavorites_Click(...) Handles tsmDeleteChromeFavorites.Click DeleteChromeFavorites(Me) DeleteChromeFavorites Importierte Chrome-Favoriten löschen
Projektdateien herunterladen

Fussnoten

  1. Andreas Maslo, Erweitertes Browser-Control, Ein eigenes Steuerelement für Webinhalte, Teil 1, dotnetpro 10/2021, Seite 136 ff., http://www.dotnetpro.de/A2110BasicInstinct
  2. Andreas Maslo, Code für den Browser, Ein eigenes Steuerelement für Webinhalte, Teil 2, dotnetpro 11/2021, Seite 136 ff., http://www.dotnetpro.de/A2111BasicInstinct
  3. Andreas Maslo, Den Browser ausbauen, Ein eigenes Steuerelement für Webinhalte, Teil 3, dotnetpro 12/2021, Seite 136 ff., http://www.dotnetpro.de/A2112BasicInstinct
  4. Andreas Maslo, Webseiten prüfen, Ein eigenes Steuer­element für Webinhalte, Teil 4, dotnetpro 1/2022, Seite 134 ff., http://www.dotnetpro.de/A2201BasicInstinct
  5. Andreas Maslo, Favoriten verwalten, Ein eigenes Steuer­element für Webinhalte, Teil 5, dotnetpro 2/2022, Seite 134 ff., http://www.dotnetpro.de/A2202BasicInstinct
  6. Andreas Maslo, Icons für die Favoriten, Ein eigenes Steuerelement für Webinhalte, Teil 6, dotnetpro 3/2022, Seite 134 ff., http://www.dotnetpro.de/A2203BasicInstinct
  7. Andreas Maslo, Favoriten unter Kontrolle, Ein eigenes Steuerelement für Webinhalte, Teil 7, dotnetpro 4/2022, Seite 134 ff., http://www.dotnetpro.de/A2204BasicInstinct
  8. Andreas Maslo, Sonderfunktionen, Ein eigenes Steuerelement für Webinhalte, Teil 8, dotnetpro 5/2022, Seite 134 ff., http://www.dotnetpro.de/A2205BasicInstinct
  9. Andreas Maslo, Endspurt, Ein eigenes Steuerelement für Webinhalte, Teil 9, dotnetpro 6/2022, Seite 134 ff., http://www.dotnetpro.de/A2206BasicInstinct
  10. Andreas Maslo, Google Chrome Bookmarks, Ein eigenes Steuerelement für Webinhalte, Teil 10, dotnetpro 7/2022, Seite 134 ff., http://www.dotnetpro.de/A2207BasicInstinct
  11. Andreas Maslo, Methoden für Bookmarks, Ein eigenes Steuerelement für Webinhalte, Teil 11, dotnetpro 8/2022, Seite 134 ff., http://www.dotnetpro.de/A2208BasicInstinct

Neueste Beiträge

DWX hakt nach: Wie stellt man Daten besonders lesbar dar?
Dass das Design von Websites maßgeblich für die Lesbarkeit der Inhalte verantwortlich ist, ist klar. Das gleiche gilt aber auch für die Aufbereitung von Daten für Berichte. Worauf besonders zu achten ist, erklären Dr. Ina Humpert und Dr. Julia Norget.
3 Minuten
27. Jun 2025
DWX hakt nach: Wie gestaltet man intuitive User Experiences?
DWX hakt nach: Wie gestaltet man intuitive User Experiences? Intuitive Bedienbarkeit klingt gut – doch wie gelingt sie in der Praxis? UX-Expertin Vicky Pirker verrät auf der Developer Week, worauf es wirklich ankommt. Hier gibt sie vorab einen Einblick in ihre Session.
4 Minuten
27. Jun 2025
„Sieh die KI als Juniorentwickler“
CTO Christian Weyer fühlt sich jung wie schon lange nicht mehr. Woran das liegt und warum er keine Angst um seinen Job hat, erzählt er im dotnetpro-Interview.
15 Minuten
27. Jun 2025
Miscellaneous

Das könnte Dich auch interessieren

UIs für Linux - Bedienoberflächen entwickeln mithilfe von C#, .NET und Avalonia
Es gibt viele UI-Frameworks für .NET, doch nur sehr wenige davon unterstützen Linux. Avalonia schafft als etabliertes Open-Source-Projekt Abhilfe.
16 Minuten
16. Jun 2025
Mythos Motivation - Teamentwicklung
Entwickler bringen Arbeitsfreude und Engagement meist schon von Haus aus mit. Diesen inneren Antrieb zu erhalten sollte für Führungskräfte im Fokus stehen.
13 Minuten
19. Jan 2017
Bausteine guter Architektur - Entwurf und Entwicklung wartbarer Softwaresysteme, Teil 2
Code sauberer gestalten anhand von wenigen Patterns und Grundhaltungen.
6 Minuten
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige