Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von MrSparkle
Thema: Visualle Unterschiede in einem Bild erkennen
Am im Forum: Grafik und Sound

Zitat von Christoph K.
Konkret möchte ich zwei Versionen einer Webseite vergleichen (die gerenderten Versionen). Wenn ich die Pixel 1 zu 1 vergleich, dann würde ich eine fast 100%ige Änderung erhalten, wenn ich oben auf der Webseite eine Zeile Text einfüge. Ich suche nun nach einem Verfahren/Algorithmus, der mir in diesem Fall ein realistischeres Ergebnis liefern würde.

Was genau wäre für dich in diesem Fall ein realistisches Ergebnis?

Thema: String auf mehrere Zeilen prüfen
Am im Forum: GUI: Windows-Forms

Wenn man nur wissen möchte, ob ein String einen Zeilenumbruch enthält, dann geht das am einfachsten so:


bool isMultiLine = someText.Contains('\n');

Das funktioniert mit Texten von (fast) allen Systemen, denn die meisten Systeme benutzen irgendeine Kombination mit '\n' oder nur '\n' für einen Zeilenumbruch.

Thema: Anzahl Checkbox checked als Wert für for Schleife
Am im Forum: Grundlagen von C#

Beschäftige dich mal mit objektorientierter Programmierung. Steuerelement in der UI und Anwendungs-Einstellungen sind auch nur spezielle Fälle davon. Damit kannst du dich dann beschäftigen, wenn du die Basics beherrschst.

Arbeite am besten mal ein Buch durch, z.B. das kostenlose C#-Buch vom Rheinwerk-Verlag: Visual C# 2012 - Das umfassende Handbuch von Andreas Kühnel.

Das Forum ist besser geeignet, wenn du konkrete Fragen hast. Lernen und üben können wir dir hier nicht abnehmen.

Siehe dazu auch [Hinweis] Wie poste ich richtig?

Thema: gleiche Hintergrundfarbe für einige DataGridTextColumns
Am im Forum: GUI: WPF und XAML

Siehe dazu auch [Artikel] MVVM und DataBinding, 4. Kapitel: Styles und Trigger.

Thema: Grafik strecken und pictureBox skalieren
Am im Forum: Grafik und Sound

Wenn du das Bild selber zeichnest, dann mußt du auch selbst die PictureBox skalieren und die Scrollbars anpassen. Oder andersherum das Bild skalieren, damit es in die PictureBox paßt.

Warum sollte die PictureBox eigentlich zu langsam sein, um ein Bild anzuzeigen? Sie wird ja auch nur die GDI-Funktionen des Betriebssystem dafür aufrufen.

Thema: Wie lerne ich C#?
Am im Forum: Smalltalk

Es ist wie beim Lernen von anderen Sprachen auch: Du solltest nicht nur die Lektionen durcharbeiten, sondern auch die Übungen dazu machen. Dann kannst du verstehen, anstatt auswendig zu lernen. Wenn es in deinem Kurs keine Übungen gibt, dann such dir welche im Netz, schreib ein eigenes kleines Programm, oder schau dir den Code von anderen Leuten an.

Thema: Wie mache ich einen Server Multitaskingfähig?
Am im Forum: Netzwerktechnologien

Denke, daß es mit asynchronen Methoden allein nicht besser wird. Der ganze Code ergibt irgendwie keinen Sinn. Warum hast du denn z.B. die gesamte "ServerEngine"-Klasse mit statischen Methoden implementiert?


public class ServerEngine
{
	public ServerEngine(int port)
	{
		//...
	}


	public static void Receiver(object server)
	{
		if ((ServerEngine)server) // ... 
	}
}

Hier fehlt es dir einfach an den Basics bzw. Grundlagen von objektorientierter Programmierung und C#.
Ich würde empfehlen, erstmal damit anzufangen, und sich dann im Bereich Web-Entwicklung zu belesen, und DANN überlegen, wie (und ob) man einen Webserver implementiert!

Thema: [Artikel] Debugger: Wie verwende ich den von Visual Studio?
Am im Forum: Artikel

Danke für den Hinweis! Da ist beim Migrieren etwas verloren gegangen. Wir werden uns darum kümmern.

Thema: Popup Style
Am im Forum: GUI: WPF und XAML

Siehe auch ContextMenu Styles and Templates

Thema: YouTube Kanal Deutsch (C#, ASP.NET, uvm.)
Am im Forum: Smalltalk

Zitat von Palladin007
Ich weiß nicht, wie es den Anderen geht

Lernen finde ich immer gut. Und hier handelt es sich um ein kostenloses Angebot.
Ich hab es nur in den Smalltalk-Bereich verschoben, da es keine Buchempfehlung ist.

Thema: MVVM - PropertyChanged von UserControl von anderem UserControl mitbekommen
Am im Forum: GUI: WPF und XAML

War ein bißchen mißverständlich ausgedrückt. Ein UserControl weiß nichts von MVVM oder vom ViewModel. Es kann mit oder ohne ViewModel eingesetzt werden. Deshalb gibt es im UserControl auch einen anderen Mechanismus für die Aktualisierung der Bindings (also DependencyProperties anstatt IPropertyChanged).

Und ein UserControl bekommt auch kein ViewModel als DataContext, sondern es werden Werte (keine ViewModels) an die DependencyProperties gebunden.

Meistens braucht man eh keine UserControls in WPF. Ein Anwendungsfall wäre, wenn es in unterschiedlichen Projekten wiederverwendet werden soll. Und dann muß es auch unabhängig vom verwendeten VM sein. Und bei ReactiveUI werden UserControls als IViewFor<T>eingesetzt, aber das ist hier nicht relevant. Und für alles andere ist ein Template ausreichend.

Thema: MVVM - PropertyChanged von UserControl von anderem UserControl mitbekommen
Am im Forum: GUI: WPF und XAML

Das UserControl ist die View (das "V" in MVVM), und das PropertyChanged-Ereignis gibt es nur im ViewModel (das "VM" in MVVM). Und die View kennt das ViewModel nicht, daher kennt das UserControl auch keine PropertyChanged-Ereignisse!

Das UserControl hat stattdessen DependencyPropertys (bzw. Ereignisse) als öffentliche API. Daran kannst du dann deine ViewModel-Eigenschaften binden, und natürlich auch DependencyPropertys von anderen Controls. Was innerhalb eines UserControls passiert, ist für den Rest der Anwendung völlig irrelevant.

Thema: Punkterotation
Am im Forum: Grafik und Sound

In dieser Zeile verwendest du den bereits geänderten Wert für x anstatt den Original-Wert:


y = (x * Math.Sin(angle * Math.PI / 180)) + (y * Math.Cos(angle * Math.PI / 180));

Thema: MultiDataTrigger-Binding - Null-Value-Exception
Am im Forum: GUI: WPF und XAML

Zitat von GeneVorph
Ich vermute es fehlt ein Nicht-Null-Wert – was auch immer das bedeuten mag.

Ein "Nicht-Null-Wert" ist ein Wert, der nicht null ist. Du kannst dem Template nicht null zuweisen, aber wo genau das auftritt, sollte dir die Fehlermeldung sagen.

Ansonsten scheint es in deinem Code noch mehrere andere Merkwürdigkeiten zu geben. Wo defininierst du z.B. das Template für "ExpanderHeaderCollapsedType", und warum gibst du als TargetNullValue für einen String-Wert ein "true" an?

Thema: Array in Methode auslagern
Am im Forum: Grundlagen von C#

Indem du in der Methode ein Array erstellst, dann mit Werten befüllst, und es zurückgibst:


private string[] CreateArray()
{
    string[] cryptKey = new string[33];
    // ....
    return cryptKey;
}

Und dann kannst du es als Parameter an eine andere Methode übergeben:


var cryptKey = CreateArray();
DoSomething(cryptKey);

Hier gibt es ein paar Links für den Einstieg: [FAQ] Wie finde ich den Einstieg in C#?

Thema: Welche Möglichkeiten habe ich einen Kalender im "Outlook"-Style zu designen?
Am im Forum: GUI: WPF und XAML

Für die Benutzeroberfläche würde ich ein Grid mit SharedSizeGroup in einem ItemsTemplate verwenden. Als Datenmodell hat du eine Auflistung von Wochen verwenden, die eine Auflistung von (jeweils 7) Tagen haben. Die Anzahl der Wochen sollte dabei allerdings nicht statisch sein, weil ein Februar auch hin und wieder mal nur 4 Wochen haben wird.

Diese Listen kannst du dann an das ItemsTemplate binden, und dem Grid das Layout überlassen. Hier gibt es ein Code-Beispiel: Generating grid dynamically in MVVM pattern.

Daß du keine fertige Lösung verwenden willst, heißt ja nicht, daß du nicht auch in Code von anderen Leuten reinschauen kannst, die das schon mal umgesetzt haben. Kalender wurden schon mehrfach umgesetzt, und der Algorithmus und das Datenmodell basieren meistens auf dem gleichen Prinzip.

Du solltest bei deinem Datenmodell dann halt noch beachten, daß sich Termine über mehrere Tage oder sogar Monate erstrecken können.

Thema: Wie benutze ich Konstruktoren und Parameter richtig?
Am im Forum: Grundlagen von C#

Zitat von cicero
Da fehlt mir die nötige Erfahrung.

Dir fehlen die Grundlagen, daher der Link auf den Artikel.
Zitat von cicero
Konvertierung von "int" in "PokerYT.SUI" nicht möglich.

Die Fehlermeldung ist doch relativ aussagekräftig: Du hast extra eine Enum dafür definiert, verwendest aber Integer-Werte.


Bitte lies dir mal die Grundlagen von C# durch. Du kannst nicht erwarten, daß dir das einfach so zufliegt...

Thema: Wie benutze ich Konstruktoren und Parameter richtig?
Am im Forum: Grundlagen von C#

Bitte poste deinen Code nicht als Plain-Text und verwende Code-Tags [Hinweis] Wie poste ich richtig?

Ansonsten empfehle ich einen Blick in [FAQ] Wie finde ich den Einstieg in C#?

Thema: Audio-Peak von Anwendungen auslesen (Code inside) - Frage
Am im Forum: Grafik und Sound

Es gibt keine "einzelne Anwendung auf der Soundkarte". Die Soundkarte gibt nur Audio-Signale aus. Die Signale von den einzelnen Anwendungen werden im Betriebssystem gemischt, und dann auf der Soundkarte ausgegeben. Wenn du die Lautstärke einer bestimmten Anwendung messen willst, mußt du die Signale vor der Mischung abgreifen. Und dazu gibt es die genannte Schnittstelle.

Es gibt für die API eine Dokumentation und Quellcode-Beispiele. Sicherlich nicht für dein spezielles Problem, aber mit ein bißchen Anstrengung findest du dafür die Lösung.

Thema: Audio-Peak von Anwendungen auslesen (Code inside) - Frage
Am im Forum: Grafik und Sound

Das heißt Audio Session und dafür gibt es die WASAPI-Schnittstelle: Session Volume Controls

Thema: Events feuern nicht auf jedem PC
Am im Forum: Grundlagen von C#

Du solltest dir auch mal [Artikel] MVVM und DataBinding anschauen. Wenn man DataBinding verwendet, dann kann man weitestgehend auf Events verzichten, und man muß sich auch keine Sorgen machen, in welchem Thread was ausgeführt wird.

Und auch Datenbank-Operationen haben nichts in der UI verloren. Siehe dazu [Artikel] Drei-Schichten-Architektur

Wenn du das beruflich machst, solltest du dich mal mit den Grundlagen der Software-Entwicklung auseinandersetzen. Sonst wirst du immer wieder von einem "kuriosen" Problem zum anderen stolpern.

Thema: PDFs erstellen unter ASP.NET Core
Am im Forum: Web-Technologien

Ich hab mich entschieden, die PDF-Erstellung mit XSL-FO in Kombination mit Razor umzusetzen.

XSL-FO ist als Format genau dafür geschaffen worden, Druckdokumente zu erstellen, und ist leicht zu verstehen, wenn man mit HTML und CSS Erfahrung hat. Hier gibt es die Doku und ein paar Tutorials. Und mit Razor als Template-Engine kann man aus Daten einfach Reports erstellen, das kenne ich noch von ASP.NET MVC.

Ich verwende dazu das Package RazorEngineCore.

So kann man damit ein Template kompilieren und auswerten:


// Compiling is only done once
IRazorEngine razorEngine = new RazorEngine();
var compiledTemplate = await razorEngine.CompileAsync<RazorEngineTemplateBase<TModel>>(templateContent)
    .ConfigureAwait(false);

// Resolving a FO template for the specified model
string foTemplateResult = await compiledTemplate.RunAsync(instance =>
    {
        instance.Model = model;
    }).ConfigureAwait(false);

Für das Rendern des Templates in eine PDF verwende ich das Package Fonet.Standard (Source Code, Wiki). Das funktioniert soweit sehr gut. Ein paar Einschränkungen muß man dafür allerdings hinnehmen:
  • Bilder mit transparentem Hintergrund werden nicht unterstützt
  • SVGs werden nicht unterstützt (aber andere Vektor-Formate)
  • Tabellen mit automatischen Spaltenbreiten sind nicht möglich
  • Es können nur Schriftarten verwendet werden, die im Betriebssystem installiert sind

So funktioniert das Rendern der PDF:


var foNetDriver = FonetDriver.Make();
foNetDriver.Options = /* Set PDF options */;
foNetDriver.CloseOnExit = false; // Don't close stream after rendering
foNetDriver.ImageHandler = /* Set callback to load images from files or resources */;
foNetDriver.Render(foInputStream, pdfOutputStream);

Insgesamt sind das ca. 100 Zeilen Code in einer .NET-Standard-Bibliothek, die wir zukünftig für Web- und Desktop-Anwendungen verwenden können.

Das Template sieht z.B. so aus:

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">  
  <fo:layout-master-set>
    <fo:simple-page-master master-name="simple" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
      <fo:region-body region-name="page-body" margin-bottom="2cm" margin-top="2cm" />
      <fo:region-before region-name="page-header" extent="2cm" />
      <fo:region-after region-name="page-footer" extent="2cm" />
    </fo:simple-page-master>
  </fo:layout-master-set>
  
  <fo:page-sequence master-reference="simple" font-family="Montserrat">
    <fo:static-content flow-name="page-header">
      <fo:block font-family="Montserrat SemiBold" font-size="22pt">
        <fo:external-graphic src="logo.png" height="22pt" margin-right="1cm" />
        @Model.CompanyName
      </fo:block>
    </fo:static-content>
    
    <fo:static-content flow-name="page-footer">
      <fo:block margin-top="2cm" text-align="right" font-style="italic" color="#777777">
        @Model.Copyright
      </fo:block>
    </fo:static-content>
    
    <fo:flow flow-name="page-body">

      <fo:table table-layout="fixed" 
                inline-progression-dimension="auto"
                width="100%" 
                padding-after="2cm"
                font-size="8pt">
        <fo:table-column column-number="1" column-width="5cm" />
        <fo:table-column column-number="2" />
        <fo:table-column column-number="3" />
        <fo:table-column column-number="4" />
        <fo:table-column column-number="5" />

        <fo:table-header border-after-style="solid" 
                         border-after-color="black" 
                         border-after-width="thin">
          <fo:table-row font-weight="bold">
            <fo:table-cell>
              <fo:block>
                Mitarbeiter
              </fo:block>
            </fo:table-cell>
            <fo:table-cell>
              <fo:block>
                Datum
              </fo:block>
            </fo:table-cell>
            <fo:table-cell>
              <fo:block>
                Position
              </fo:block>
            </fo:table-cell>
            <fo:table-cell>
              <fo:block>
                Team
              </fo:block>
            </fo:table-cell>
            <fo:table-cell>
              <fo:block>
                Email
              </fo:block>
            </fo:table-cell>
          </fo:table-row>
        </fo:table-header>
        
        <fo:table-body>
          @{ int i = 0; }
          @foreach (var item in Model.Employees)
          {
            <fo:table-row background-color="@(++i % 2 == 0 ? "white" : "#f7f7f7")">
              <fo:table-cell>
                <fo:block>
                  @item.Salutation @item.FirstName @item.LastName 
                </fo:block>
              </fo:table-cell>
              <fo:table-cell>
                <fo:block>
                  @item.DateOfEntry.ToString("dd.MM.yy")
                </fo:block>
              </fo:table-cell>
              <fo:table-cell>
                <fo:block>
                  @item.WorkPosition
                </fo:block>
              </fo:table-cell>
              <fo:table-cell>
                <fo:block>
                  @item.Team
                </fo:block>
              </fo:table-cell>
              <fo:table-cell>
                <fo:block>
                  <fo:basic-link external-destination="mailto:@item.EmailAdress">@item.EmailAdress</fo:basic-link>
                </fo:block>
              </fo:table-cell>
            </fo:table-row>
          }
        </fo:table-body>
      </fo:table>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

Wenn die Schema-Datei im gleichen Verzeichnis liegt wie die Template-Dateien, bekommt man in Visual Studio sogar Intellisense für XSL-FO.

Das mag vielleicht ein bißchen over-engineered aussehen, ist aber wesentlich besser als DevExpress- und Crystal-Reports oder die Konvertierung von HTML- oder Word-Dateien.

Thema: PDFs erstellen unter ASP.NET Core
Am im Forum: Web-Technologien

Danke für die schnellen Antworten!

Zitat von gfoidl
ist XSL-FO eine Option?

Ich glaube, das ist das, wonach ich gesucht hatte. Eine Auszeichnungssprache für Druckdokumente. Ein erster Test hat gezeigt, daß es macht, was es soll. Jetzt werde ich mal ein komplexeres Layout umsetzen.

Danke!

Thema: PDFs erstellen unter ASP.NET Core
Am im Forum: Web-Technologien

Hallo allerseits,

ich bin auf der Suche nach einer Möglichkeit, PDF-Dateien aus Templates + Daten zu erstellen. Diese Dateien sollen mehrseitig, möglichst barrierefrei zugänglich sein, und mit Seiten-Headern und -Footern ausgestattet sein. Das ganze soll in einer ASP.NET Core Web-Anwendung unter Linux laufen.

Bisher haben wir dafür das Reporting-Tool von DevExpress verwendet. Dafür hat man das Layout in einem proprietären Editor zusammengefrickelt, und dann die Daten per "DataBinding" in das Layout gefrickelt. Im Zuge der Umstellung auf .NET 5 wollen wir davon wegmigrieren.

Ich war ein bißchen ernüchtert, nachdem ich diesen Artikel gelesen hatte: Creating A PDF In .NET Core. Jemand hat dort die aktuellen (2019) Möglichkeiten evaluiert. Die Kommentare darunter sind auch sehr aufschlußreich. Offenbar gibt es kein Tool von kostenlos bis extrem teuer, das unsere Anforderungen abdeckt. Entweder gibt es keine Lösung für .NET Core, oder es läuft nicht unter Linux, oder es werden bei Seitenumbrüchen die Hälfte der letzten Zeile auf Seite 1 und die andere Hälfte der Zeile auf Seite 2 gedruckt, was für professionelle Dokumente natürlich nicht akzeptabel ist.

Und alle Bibiotheken, die kein Templating unterstützen, wo man also jedes Element selbst auf der Seite positionieren muß, kommt für unsere Zwecke nicht in Frage.

Meine erste Idee war daher, ein HTML- bzw. Razor-Template zu verwenden, und das dann in einem Headless-Chromium-Browser auf dem Server in ein PDF zu rendern. Aber leider eignet sich HTML nicht als Druckformat, denn sich auf allen Seiten wiederholende Header und Footer werden z.B. derzeit nur mit sehr häßlichen Workarounds unterstützt.

Eine andere Idee ist, mit Hilfe des Open XML SDK ein Word-Dokument zu erstellen, und das dann mittels LibreOffice per Kommandozeile in ein PDF zu konvertieren. Das scheint die einzige Möglichkeit zu sein, die alle unsere Anforderungen abdeckt. Aber vom Aufwand her übertrifft das noch das Erstellen von DevExpress-Reports.

Hat jemand etwas ähnliches schon im Einsatz? Oder gibt es andere Ideen?

Thema: Wie bringe ich XAML in Code behind? (Fluent Ribbon)
Am im Forum: GUI: WPF und XAML

Ich verweise an der Stelle mal auf diesen Beitrag: Wie kann ich eine Collection von Dictionarys in einer Listview anzeigen?

Zitat von gijoe222
……...Was für eine dumme und arrogante Antwort. Wie alt bist du? 10? Kein Wunder werden deutsche Foren gemieden wie die sau.

Das müssen wir hier nicht noch einmal wiederholen

Thema: WPF App (Win10) wird beim Start gekillt
Am im Forum: GUI: WPF und XAML

Was heißt ohne Erfolg? Wenn es eine unbehandelte Ausnahme gibt, wird das entsprechende Ereignis ausgelöst.

Thema: WPF App (Win10) wird beim Start gekillt
Am im Forum: GUI: WPF und XAML

Catch and display unhandled exceptions in your WPF app

Thema: Wie kann ich die Reaktion auf Eingabe in ComboBox/TextBox verzögern?
Am im Forum: GUI: Windows-Forms

Wenn du System.Reactive.Linq verwendest, kannst du die einfach die Events als Observable abonnieren und die Observable.Throttle-Methode verwenden. In der Doku gibt es ein Beispiel.

Thema: Wie mache ich einen Task zum Arbeiten im Hintergrund asynchron?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Die WebClient-Methoden sind aber schon asynchrone Methoden, die hast du in deinem Beispiel nicht. Du willst Code parallel ausführen. Dafür reicht im einfachsten Fall ein Aufruf von Parallel.ForEach.

Ich empfehle, dir mal die Doku zu Tasks, asynchroner Programmierung und der Parallel-Klasse bzw. PLinq durchzulesen, damit du verstehst, worum es geht. Asynchrone Programmierung und parallele Programmierung sind zwei unterschiedliche Sachen.

Thema: WPF App (Win10) wird beim Start gekillt
Am im Forum: GUI: WPF und XAML

Zitat von Abt
ich sehe gerade, dass die Applikation auf Q liegt, was nach Netzlaufwerk riecht.

Wenn es ein Netzlaufwerk ist, wird es mit Sicherheit daran liegen. Dann versuch mal, die Anwendung von einem nicht-Netzlaufwerk zu starten.