Disegno e grafica in Wisej.NET
Prima o poi ogni applicazione gestionale chiede qualcosa che nessun controllo standard sa disegnare: un indicatore, una sparkline dentro una cella, una mappa di topologia interattiva, un PNG allegato al report di fine turno. Questo corso avanzato ti insegna a produrre quella grafica alla maniera di Wisej.NET — scegliendo la superficie di rendering prima di scrivere la prima chiamata di disegno — il tutto costruito attorno a VisualOperationsStudio, un'applicazione di operations in cui un unico modello di telemetria e topologia viene reso in quattro modi diversi. Sette moduli partono dall'architettura di disegno di Wisej.NET e dal confine tra server e browser, per passare all'evento Paint dei controlli fatto come si deve, al disegno delle celle della DataGridView su griglie da mille righe, a Wisej.Web.Canvas e al modello Canvas 2D di HTML5. Da lì trasformerai il canvas in un editor interattivo con hit testing, pan e zoom, genererai immagini off-screen con System.Drawing.Managed su Windows, Linux, macOS, iOS e Android, e concluderai con un'architettura di disegno pronta per la produzione, strumentata e misurata, nel capstone. È pensato per sviluppatori .NET esperti che già costruiscono schermate Wisej.NET e ora hanno bisogno di grafica personalizzata.
Crea grafica personalizzata con Paint, CellPaint, Canvas e System.Drawing.Managed multipiattaforma.
- Livello: Advanced
- Durata: 10 ore
- Moduli: 7
Programma
Modulo 1: L'architettura di disegno di Wisej.NET
Modulo 1 di Disegno e grafica in Wisej.NET — crea grafica personalizzata con Paint, CellPaint, Canvas e System.Drawing.Managed multipiattaforma. Leggi la guida della lezione e la guida al lab / esame, guarda la videoguida sull'architettura di disegno, supera la verifica delle conoscenze e completa il lab pratico in VisualOperationsStudio.
- LetturaGuida della lezione · 14 min
Quattro pipeline di rendering e come scegliere fra loro: il Paint dei controlli, che spedisce un'immagine generata sul server; il CellPaint della DataGridView, dentro una singola cella; Wisej.Web.Canvas, che invia comandi di disegno al browser; e System.Drawing.Managed off-screen, che produce byte di immagine — più la scala di decisione che tiene come default i controlli standard e il CSS. Che cosa significa per uno sviluppatore .NET esperto che già costruisce schermate Wisej.NET e ora ha bisogno di grafica personalizzata — e come affrontare questo modulo.
- LetturaGuida al lab / esame · 10 min
Che cosa costruirai nel lab pratico, l'approccio suggerito e i deliverable richiesti.
- Lezione videoQuattro superfici, un solo valore: da dove arrivano i pixel · 14 min
Quattro superfici, un solo valore: da dove arrivano i pixel — una videoguida del Modulo 1, costruita passo dopo passo in VisualOperationsStudio. Parte direttamente qui nel player.
Trascrizione della narrazione
Disegno e grafica in Wisej.NET si apre con una decisione che viene prima di qualsiasi codice di disegno: dove vengono prodotti davvero i pixel. In questo modulo una sola lettura di telemetria viene mostrata su quattro superfici diverse di Visual Operations Studio, così puoi confrontarle fianco a fianco.
Chiedere a un'applicazione di disegnare un numero non è un requisito solo, sono quattro. Un quadrante su un cruscotto, un piccolo indicatore dentro una cella di griglia, un nodo su una mappa di topologia e un'immagine scritta su un file di report mostrano tutti lo stesso valore, eppure ognuno viene prodotto altrove e ognuno manda al browser qualcosa di diverso.
Un gestore Paint viene eseguito sul server, e il risultato finito viaggia fino al browser sotto forma di immagine. Il CellPaint fa lo stesso lavoro, confinato dentro i limiti di una sola cella. Un Canvas si comporta in modo diverso: invia comandi di disegno che il browser esegue da sé. Il disegno off-screen produce byte di immagine che nessun controllo mostra mai.
Nella pagina, tutte e quattro le superfici leggono un solo campo di telemetria, quindi nessuna di loro possiede il valore. Un pulsante cambia quel campo e aggiorna ogni superficie a modo suo: la label e la barra di avanzamento si limitano a leggerlo, il pannello disegnato viene invalidato perché il server lo ridisegni, il metodo che costruisce la scena del Canvas viene eseguito di nuovo, e viene prodotta una nuova immagine off-screen.
Il disegno personalizzato sta in fondo a una scala di decisione, non all'inizio. Parti da un controllo standard, poi dal markup ordinario, e solo allora da un gestore Paint, da una cella disegnata o da un Canvas. Il disegno off-screen viene dopo, e un ciclo di disegno nel browser resta riservato ai casi in cui i fotogrammi al secondo contano davvero.
Ridisegnare un Canvas significa svuotarlo e ricostruire l'intera scena a partire dal modello, perché la copia che ha il browser non è qualcosa su cui il server possa contare. Il renderer off-screen sta all'estremo opposto: un Bitmap, e una superficie Graphics creata sopra di esso, bastano a produrre un'immagine senza che sia coinvolto nessun controllo.
Esegui la pagina e premi il pulsante New reading. Lo stesso numero compare in tutti e quattro i punti nello stesso istante, e questo fa sembrare che sia una sola operazione. Non lo è. Ogni superficie ha appena messo in rete qualcosa di molto diverso per arrivarci, ed è proprio quella differenza il vero tema di questo modulo.
Adesso ridimensiona la finestra del browser. Tre superfici tornano da sole, perché è ancora il server a possedere quello che mostrano. Il Canvas torna vuoto, e resta vuoto finché il metodo di ridisegno non lo ricostruisce dalla lettura di telemetria che il server ha conservato. Quell'asimmetria è la conseguenza pratica del confine.
Nel primo lab costruisci tu questa pagina: un solo modello dietro quattro superfici, un unico pulsante che le aggiorna tutte, e una breve nota che registra che cosa attraversa la rete per ogni superficie e quali elementi grafici sopravvivono a un ridimensionamento.
- LetturaEsercizio di coding con l'IA · 20 min
Costruisci il progetto VisualOperationsStudio di questo modulo con ChatGPT o Claude partendo da un prompt già pronto che indirizza il modello alla specifica del modulo, poi rivedi, esegui ed estendi quello che ti restituisce.
- VerificaVerifica delle conoscenze — Modulo 1 · 10 min · Soglia di superamento 80%
- Laboratorio praticoLab — Un valore, quattro superfici di rendering · 45 min
Obiettivo: Costruisci lo shell di VisualOperationsStudio e rendi un'unica lettura di telemetria su quattro superfici contemporaneamente. Crea una VisualOperationsPage che contiene una sola istanza del modello TelemetrySample, poi presentane il valore come (1) una semplice Label più una ProgressBar, (2) un Panel con un handler di Paint che disegna una barra a partire da PaintEventArgs.Graphics e da e.ClipRectangle, (3) un Wisej.Web.Canvas il cui handler di Redraw ricostruisce la stessa barra dal modello e (4) un Bitmap off-screen generato con Graphics.FromImage e mostrato in una PictureBox. Collega un pulsante che cambia il valore del modello e aggiorna tutte e quattro le superfici tramite Invalidate() e un redraw del Canvas, poi ridimensiona il browser e annota quali superfici sopravvivono e quali devono essere ricostruite. Deliverable: VisualOperationsPage con un unico modello TelemetrySample da cui legge ogni superficie; handler di Paint che disegna da PaintEventArgs.Graphics dentro e.ClipRectangle; handler di Redraw del Canvas che ricostruisce l'intera scena dal modello dopo un ridimensionamento; Bitmap off-screen generato con Graphics.FromImage e mostrato nella pagina; SurfaceNotes.md che annota che cosa attraversa la rete per ciascuna superficie e quali elementi visivi sopravvivono a un ridimensionamento.
Modulo 2: Padroneggiare l'evento Paint dei controlli
Modulo 2 di Disegno e grafica in Wisej.NET — crea grafica personalizzata con Paint, CellPaint, Canvas e System.Drawing.Managed multipiattaforma. Leggi la guida della lezione e la guida al lab / esame, guarda la videoguida sull'indicatore disegnato, supera la verifica delle conoscenze e completa il lab pratico in VisualOperationsStudio.
- LetturaGuida della lezione · 14 min
Controlli disegnati sul server fatti come si deve: PaintEventArgs.Graphics e ClipRectangle, la geometria separata dal disegno, il dispose di ogni pen, brush e font che crei, setter di proprietà che chiamano Invalidate() esattamente una volta e il budget di costo del disegno che decide quando un controllo a tema è la risposta migliore. Che cosa significa per uno sviluppatore .NET esperto che già costruisce schermate Wisej.NET e ora ha bisogno di grafica personalizzata — e come affrontare questo modulo.
- LetturaGuida al lab / esame · 10 min
Che cosa costruirai nel lab pratico, l'approccio suggerito e i deliverable richiesti.
- Lezione videoCostruisci un indicatore disegnato che si ridisegna solo quando serve · 14 min
Costruisci un indicatore disegnato che si ridisegna solo quando serve — una videoguida del Modulo 2, costruita passo dopo passo in VisualOperationsStudio. Parte direttamente qui nel player.
Trascrizione della narrazione
Questo modulo costruisce un controllo disegnato come si deve. Il gauge di telemetria disegna un anello, le sue zone di soglia, un ago e una lettura numerica, e ognuna delle sue proprietà pubbliche fa il clamp di quello che riceve prima ancora di decidere se serva davvero un ridisegno.
Il tuo codice di disegno viene eseguito sul server, e il browser riceve l'immagine risultante. È comodo, ed è anche il motivo per cui un gestore copiato dentro sei pannelli costa caro: vengono prodotte sei immagini, vengono creati sei insiemi di oggetti di disegno, e avvengono ridisegni che nessuno ha chiesto.
Quindi prima misura, poi disegna. L'helper di geometria prende un rettangolo e restituisce i bounds dell'anello, gli angoli di apertura, i punti dell'ago e il rettangolo in cui sta l'etichetta. È aritmetica ordinaria, senza disegno dentro, e questo significa che puoi testare la parte difficile senza creare mai un controllo.
Ogni setter di proprietà segue una sola ricetta: fai il clamp del valore in arrivo, confrontalo con quello corrente, esci subito se non è cambiato nulla, assegnalo e chiama Invalidate esattamente una volta. La stessa riga di codice aggiorna anche l'AccessibleDescription, così la lettura resta disponibile come testo e non soltanto come pixel.
Il gestore si protegge da un clip di dimensione zero, chiama il passo di misura una volta sola, poi disegna. Cinque dichiarazioni using coprono i cinque oggetti che questo codice crea e quindi possiede. La superficie Graphics che ricevi negli argomenti dell'evento non è uno di questi, e farne il dispose sarebbe un errore.
La proprietà degli oggetti risolve quasi tutte le domande scomode. I brush e le pen del framework sono condivisi e vanno lasciati stare, una pen statica tua non è sicura quando più sessioni disegnano insieme, e una chiamata al database, il caricamento di un font o un timer non hanno nulla da fare dentro un percorso di disegno.
Guardalo mentre gira. Si muove una lettura, quindi si invalida un solo gauge e viene prodotta una sola immagine. Gli altri due setter hanno confrontato i valori e sono usciti subito, ed è esattamente questo il punto. Poi un ridimensionamento ricostruisce ogni immagine dal nuovo clip, alla nuova dimensione.
Poi arriva il budget: tempo di processore sul server, memoria per la bitmap temporanea, e byte spediti a ogni ridisegno. Quando quei numeri smettono di giustificare i pixel, un controllo tematizzato è la risposta migliore. In ogni caso, i valori stessi devono restare leggibili come testo.
Nel secondo lab costruisci il gauge e il suo helper di geometria puro, ti proteggi da una dimensione zero e da un intervallo invertito, pubblichi la lettura tramite l'AccessibleDescription e registri nelle tue note quanto costa un ridisegno.
- LetturaEsercizio di coding con l'IA · 20 min
Costruisci il progetto VisualOperationsStudio di questo modulo con ChatGPT o Claude partendo da un prompt già pronto che indirizza il modello alla specifica del modulo, poi rivedi, esegui ed estendi quello che ti restituisce.
- VerificaVerifica delle conoscenze — Modulo 2 · 10 min · Soglia di superamento 80%
- Laboratorio praticoLab — Un indicatore di telemetria disegnato e riutilizzabile · 45 min
Obiettivo: Aggiungi a VisualOperationsStudio un controllo TelemetryGauge riutilizzabile che disegna un anello, zone di soglia colorate, una lancetta, un valore numerico e una didascalia. Dagli le proprietà Value, Minimum, Maximum, WarningThreshold e CriticalThreshold, con setter che limitano l'input, escono subito quando nulla è cambiato e chiamano Invalidate() una volta sola. Metti i calcoli delle coordinate in un helper puro GaugeGeometry che riceve un Rectangle e restituisce i limiti dell'anello, gli angoli di apertura, i punti della lancetta e il rettangolo dell'etichetta, poi disegna a partire da quei valori con pen, brush e un GraphicsPath racchiusi in using, lasciando in pace il Graphics che ti viene passato. Gestisci senza eccezioni un controllo a dimensione zero, un intervallo invertito e un valore fuori intervallo, ed esponi la lettura tramite AccessibleDescription così da non affidarla ai soli pixel. Deliverable: controllo TelemetryGauge con proprietà Value, Minimum, Maximum e di soglia che limitano il valore e chiamano Invalidate() una sola volta per ogni cambiamento reale; helper puro GaugeGeometry che restituisce i limiti dell'anello, gli angoli di apertura, i punti della lancetta e il rettangolo dell'etichetta; handler di Paint che fa il dispose di ogni pen, brush, font e path che crea e non fa mai il dispose di e.Graphics; protezioni per dimensione zero, intervallo invertito e valori fuori intervallo, con un AccessibleDescription che porta la lettura; PaintCost.md che annota la dimensione del ridisegno, la sua frequenza e quando un controllo a tema costerebbe meno.
Modulo 3: Disegno delle celle della DataGridView
Modulo 3 di Disegno e grafica in Wisej.NET — crea grafica personalizzata con Paint, CellPaint, Canvas e System.Drawing.Managed multipiattaforma. Leggi la guida della lezione e la guida al lab / esame, guarda la videoguida sul disegno delle celle della DataGridView, supera la verifica delle conoscenze e completa il lab pratico in VisualOperationsStudio.
- LetturaGuida della lezione · 14 min
Disegnare dentro la griglia: UserPaint a livello di cella o di colonna, DataGridViewCellPaintEventArgs con RowIndex e ColumnIndex, celle di avanzamento e sparkline che leggono le righe a basso costo, e il confronto onesto con il contenuto di cella AllowHtml su una griglia da mille righe. Che cosa significa per uno sviluppatore .NET esperto che già costruisce schermate Wisej.NET e ora ha bisogno di grafica personalizzata — e come affrontare questo modulo.
- LetturaGuida al lab / esame · 10 min
Che cosa costruirai nel lab pratico, l'approccio suggerito e i deliverable richiesti.
- Lezione videoSparkline e indicatori dentro le celle della griglia, su larga scala · 14 min
Sparkline e indicatori dentro le celle della griglia, su larga scala — una videoguida del Modulo 3, costruita passo dopo passo in VisualOperationsStudio. Parte direttamente qui nel player.
Trascrizione della narrazione
In questo modulo è la griglia a disegnare. Visual Operations Studio ora mostra mille macchine, e due delle sue colonne devono essere leggibili a colpo d'occhio, non un numero alla volta.
Ci sono tre modi per arrivarci. Un numero bound che nessuno legge è onesto ma inutile. Un controllo gauge in ogni riga è leggibile e rovinoso, perché sono mille controlli lato server vivi in una sola sessione. La terza opzione è una cella che si disegna da sola, e solo finché è davvero visibile.
UserPaint viene sempre prima di CellPaint: una cella o un'intera colonna viene messa in modalità disegnata dall'utente, e solo allora la griglia solleva per lei l'evento CellPaint. Gli argomenti dell'evento derivano dai normali argomenti di Paint, quindi portano la superficie Graphics e il rettangolo di clip, e aggiungono gli indici di riga e di colonna che ti servono per l'instradamento.
Una differenza conta più delle altre. Gli argomenti dell'evento di Wisej.NET non portano nessun aiuto per disegnare lo sfondo o il contenuto, quindi il tuo gestore è responsabile di tutto ciò che compare in quella cella. Copiare di peso un esempio Windows Forms non funzionerà. Sottoscrivi una volta sola sulla griglia e distingui le due colonne che sono tue.
Prima le guardie, poi il disegno. Un indice di riga negativo è un'intestazione e non una riga di dati, e una colonna che non è tua esce subito. Solo a quel punto prendi la geometria dal rettangolo di clip e leggi i valori che ti servono, in un solo passo, dall'oggetto a cui la riga è già bound.
Eseguendolo, sei righe visibili producono dodici chiamate al gestore: una barra colorata per soglia su Health, e un piccolo grafico a linee per Trend. La riga selezionata viene disegnata con i suoi colori, perché una cella disegnata che ignora la selezione sembra rotta nel momento stesso in cui qualcuno ci clicca sopra.
Ora scorri le mille righe. Ogni cella che diventa visibile richiama di nuovo il gestore, e questo trasforma il gestore in un percorso caldo. Ecco perché lì dentro non c'è nessun accesso a file o database, nessun font e nessuna immagine creati per cella, ed ecco perché leggere i valori di una riga deve restare un passo a tempo costante.
Poi fai il confronto onesto. Il markup di cella vince per testo, icone e accessibilità. Il disegno vince per la geometria che il markup non sa esprimere. E un tipo di cella vero vince ogni volta che l'utente deve interagire con la cella, non solo leggerla.
Nel terzo lab costruisci due colonne disegnate dietro un unico gestore protetto, leggi i valori di ogni riga in un solo passo, poi ricostruisci lo stesso indicatore di stato come cella di markup e metti per iscritto quale dei due spediresti davvero.
- LetturaEsercizio di coding con l'IA · 20 min
Costruisci il progetto VisualOperationsStudio di questo modulo con ChatGPT o Claude partendo da un prompt già pronto che indirizza il modello alla specifica del modulo, poi rivedi, esegui ed estendi quello che ti restituisce.
- VerificaVerifica delle conoscenze — Modulo 3 · 10 min · Soglia di superamento 80%
- Laboratorio praticoLab — Celle di avanzamento e sparkline disegnate a mano · 45 min
Obiettivo: Dai a VisualOperationsStudio una griglia di operations con due colonne disegnate a mano. Aggiungi colonne esplicite a gridOperations, imposta UserPaint = true solo sulle colonne Health e Trend e gestisci CellPaint una volta sola: esci immediatamente quando e.RowIndex è negativo o e.ColumnIndex non è una delle due colonne bersaglio, poi disegna una barra di avanzamento colorata per soglia per Health e una sparkline a polilinea per Trend dentro e.ClipRectangle. Leggi i valori di ogni riga dall'oggetto MachineStatus associato invece di cercare dentro una lista nell'handler, rispetta i colori della riga selezionata e tieni l'handler privo di effetti collaterali. Associa 1.000 righe generate, scorri la griglia e poi costruisci lo stesso indicatore di stato una seconda volta come cella AllowHtml, così da poter dichiarare per iscritto quale dei due manderesti in produzione. Deliverable: gridOperations con colonne esplicite e UserPaint = true solo sulle colonne Health e Trend; un unico handler di CellPaint che verifica e.RowIndex e e.ColumnIndex prima di disegnare qualsiasi cosa; cella di avanzamento colorata per soglia e cella sparkline a polilinea disegnate dentro e.ClipRectangle; valori di riga letti dall'oggetto MachineStatus associato, senza ricerche, allocazioni o creazione di controlli per cella; una colonna di stato AllowHtml costruita in parallelo, più una nota che confronta le due soluzioni su uno scorrimento di 1.000 righe.
Modulo 4: Wisej.Web.Canvas e il modello Canvas 2D di HTML5
Modulo 4 di Disegno e grafica in Wisej.NET — crea grafica personalizzata con Paint, CellPaint, Canvas e System.Drawing.Managed multipiattaforma. Leggi la guida della lezione e la guida al lab / esame, guarda la videoguida sul Canvas 2D, supera la verifica delle conoscenze e completa il lab pratico in VisualOperationsStudio.
- LetturaGuida della lezione · 14 min
Leggere la documentazione del Canvas 2D del browser e scrivere l'equivalente Wisej.NET: membri in PascalCase su Wisej.Web.Canvas, angoli in gradi dove il browser usa i radianti, Save e Restore attorno alle trasformazioni, gradienti, pattern, ombre e clipping, e Redraw come unico punto in cui la scena viene ricostruita. Che cosa significa per uno sviluppatore .NET esperto che già costruisce schermate Wisej.NET e ora ha bisogno di grafica personalizzata — e come affrontare questo modulo.
- LetturaGuida al lab / esame · 10 min
Che cosa costruirai nel lab pratico, l'approccio suggerito e i deliverable richiesti.
- Lezione videoTraduci un esempio canvas del browser in C# di Wisej · 14 min
Traduci un esempio canvas del browser in C# di Wisej — una videoguida del Modulo 4, costruita passo dopo passo in VisualOperationsStudio. Parte direttamente qui nel player.
Trascrizione della narrazione
Visual Operations Studio ha bisogno ora di una vera superficie di disegno. Il Canvas di Wisej.NET ti dà dal C# il contesto di disegno bidimensionale del browser, con una condizione: non ricorda nulla.
Paint e CellPaint spediscono entrambi un'immagine finita, e il server sa che cosa contiene quell'immagine. Un Canvas invia invece comandi di disegno che esegue il browser. Sul server non resta nulla, e un ridimensionamento può cancellare il risultato, quindi la scena deve esistere da qualche parte che controlli tu.
Tradurre un esempio del browser richiede tre passaggi. Sistema le maiuscole, perché i membri sono quelli noti nella convenzione del C#. Sostituisci le stringhe di stile con tipi .NET, come colori e font. Converti gli angoli da radianti a gradi. Poi verifica che il membro esista davvero, invece di dare per scontato che tutto ciò che c'è nel browser sia stato riportato.
L'evento di ridisegno chiama esattamente un metodo. Quel metodo si apre svuotando l'intera superficie, e ogni forma comincia un percorso nuovo prima di disegnare. Salta quel passo e un tratto successivo si trascina dietro il contorno precedente: è uno dei modi più comuni in cui un esempio tradotto va storto.
Il testo si posiziona con le proprietà di allineamento e di linea di base invece di essere misurato, perché la chiamata di misura del browser non fa parte della superficie documentata. I gradienti sono oggetti a sé stanti: ne costruisci uno e poi lo assegni come stile di riempimento, invece di descriverlo inline ogni volta.
Ogni trasformazione sta fra un save e un restore. Così anche la regione di clipping, così la trasparenza, e così il tratteggio e l'ombra, perché sono tutti stato del Canvas e non argomenti di una singola chiamata. Racchiuderli fra parentesi impedisce a una sezione di sconfinare in quella dopo.
Cinque sezioni vengono emesse insieme in un solo update, perché il live update per impostazione predefinita resta spento. Accendilo solo quando una lunga operazione lato server deve mostrare i suoi progressi mentre lavora. Non è un modo per animare, e una richiesta per ogni fotogramma è l'architettura sbagliata.
Due modi di fallire vale la pena vederli di proposito. Ridimensiona la superficie e diventa vuota finché il ridisegno non la ricostruisce dal modello. Togli una chiamata a restore e tutto quello che viene disegnato dopo scivola fuori posto. Nessuno dei due si vede nel designer, ed è esattamente per questo che costano così tanto tempo.
Nel quarto lab disegni l'intero playground da un solo metodo chiamato dal ridisegno, racchiudi ogni trasformazione, aggiungi un clip, una sezione di trasparenza, un tratteggio e un'ombra, e porti un esempio del browser misurato in radianti nei gradi che la chiamata di rotazione di Wisej.NET si aspetta.
- LetturaEsercizio di coding con l'IA · 20 min
Costruisci il progetto VisualOperationsStudio di questo modulo con ChatGPT o Claude partendo da un prompt già pronto che indirizza il modello alla specifica del modulo, poi rivedi, esegui ed estendi quello che ti restituisce.
- VerificaVerifica delle conoscenze — Modulo 4 · 10 min · Soglia di superamento 80%
- Laboratorio praticoLab — Un playground Canvas ricostruito da Redraw · 45 min
Obiettivo: Costruisci in VisualOperationsStudio una pagina playground per il Canvas che porta una serie di esempi Canvas 2D del browser sull'API documentata di Wisej.Web.Canvas. Guida tutto da un metodo DrawPlayground chiamato dall'evento Redraw del Canvas, così che la scena ritorni dopo un ridimensionamento, e aprilo con una ClearRect su tutta la superficie. Disegna un path con contorno, rettangoli pieni, una didascalia collocata, un gradiente lineare e un gradiente radiale, poi racchiudi ogni sezione trasformata fra Save() e Restore() e dimostra Translate, Scale, Rotate e SetTransform. Aggiungi una regione con clipping, una sezione con globalAlpha, una linea tratteggiata e un'ombra, porta un esempio del browser che ruota di Math.PI / 4 nel valore in gradi che Wisej si aspetta, e tieni LiveUpdate disattivato nel rendering principale mostrandolo invece in un piccolo esempio progressivo. Deliverable: playground Canvas la cui scena è disegnata interamente da un metodo DrawPlayground chiamato da Redraw; path, rettangoli, una didascalia collocata, un gradiente lineare e un gradiente radiale usando solo membri documentati di Wisej.Web.Canvas; Save() e Restore() attorno a ogni sezione con Translate, Scale, Rotate e SetTransform; clipping, alpha, una linea tratteggiata e un'ombra, più la conversione da radianti a gradi scritta per esteso in un commento; una dimostrazione di LiveUpdate tenuta separata dal rendering principale, con una nota su quando sia appropriato.
Modulo 5: Canvas interattivo: stato, input, hit testing e prestazioni
Modulo 5 di Disegno e grafica in Wisej.NET — crea grafica personalizzata con Paint, CellPaint, Canvas e System.Drawing.Managed multipiattaforma. Leggi la guida della lezione e la guida al lab / esame, guarda la videoguida sul canvas interattivo, supera la verifica delle conoscenze e completa il lab pratico in VisualOperationsStudio.
- LetturaGuida della lezione · 14 min
Trasformare un Canvas in un editor: il ciclo Model, Input, State, Render, gli eventi pointer e touch del Control, la conversione da coordinate schermo a coordinate mondo perché l'hit testing sopravviva a pan e zoom, lo stato della scena per sessione invece che statico, il culling del viewport e il punto in cui un loop lato client sostituisce i round trip al server. Che cosa significa per uno sviluppatore .NET esperto che già costruisce schermate Wisej.NET e ora ha bisogno di grafica personalizzata — e come affrontare questo modulo.
- LetturaGuida al lab / esame · 10 min
Che cosa costruirai nel lab pratico, l'approccio suggerito e i deliverable richiesti.
- Lezione videoSelezione, trascinamento, pan e zoom senza perdere la scena · 14 min
Selezione, trascinamento, pan e zoom senza perdere la scena — una videoguida del Modulo 5, costruita passo dopo passo in VisualOperationsStudio. Parte direttamente qui nel player.
Trascrizione della narrazione
Il Canvas dimentica, e il modello non deve farlo. In questo modulo il playground del modulo precedente diventa un editor di topologia con selezione, trascinamento, pan e zoom, e ognuno di questi gesti deve sopravvivere a un ridisegno.
Un rettangolo nel browser non è una pompa. Il significato vive nell'oggetto scena sul server: i nodi, gli archi, quale sia selezionato, dove si trovi il viewport. L'input cambia quello stato, e un solo metodo di render trasforma lo stato in chiamate di disegno. Il renderer non decide mai nulla.
Il render converte le coordinate mondo in coordinate schermo applicando prima lo zoom e poi lo scostamento di pan. L'hit testing deve eseguire quella conversione all'indietro, riportando la posizione del puntatore in coordinate mondo prima di confrontarla con un nodo. Il Canvas non offre nessun test di punto dentro un percorso su cui appoggiarti, quindi questa aritmetica è tua.
Parti dal modello. Nodi e archi portano identificatori stabili e la propria geometria, e la scena che li contiene vive per sessione, mai in un campo statico modificabile che tutti gli utenti condividerebbero. L'hit test percorre la lista all'indietro, così il nodo disegnato per ultimo, e quindi sopra agli altri, è quello che l'utente ottiene.
I tre gestori del puntatore fanno pochissimo. MouseDown converte e fa hit test, MouseMove trascina la selezione oppure fa il pan del viewport, MouseUp chiude il gesto. Ognuno di loro cambia lo stato e poi chiama l'unico metodo di render. L'evento di ridisegno chiama lo stesso metodo, ed è per questo che un ridimensionamento si limita a ricostruire la scena.
Quando ridisegnare costa troppo, scendi lungo una scala: prima meno primitive, poi salta quello che è fuori schermo, poi semplifica la geometria, poi metti in cache gli strati che cambiano di rado. Spostare il ciclo nel browser è l'ultimo passo, non il primo, e il live update resta spento per il render principale.
Nel browser il clic viene convertito in coordinate mondo, trova la seconda pompa, la marca come selezionata e disegna. Guarda il contatore delle richieste salire mentre trascini. Quel numero è quanto costa davvero un trascinamento lato server, ed è la misura che ti dice quando fermarti.
Fai zoom attorno al puntatore e la selezione continua a cadere sul nodo giusto, perché la conversione inversa tiene conto del nuovo zoom. I nodi fuori dal rettangolo visibile vengono saltati del tutto. E il tasto tab insieme ai tasti freccia raggiunge ogni nodo, così l'editor non richiede un mouse per essere usabile.
Nel quinto lab costruisci la scena per sessione, fai hit testing in coordinate mondo, mantieni tutti e tre i gestori che chiamano un solo metodo di render, escludi quello che è fuori schermo, aggiungi il percorso da tastiera e registri il punto in cui sposteresti l'interazione dentro il browser.
- LetturaEsercizio di coding con l'IA · 20 min
Costruisci il progetto VisualOperationsStudio di questo modulo con ChatGPT o Claude partendo da un prompt già pronto che indirizza il modello alla specifica del modulo, poi rivedi, esegui ed estendi quello che ti restituisce.
- VerificaVerifica delle conoscenze — Modulo 5 · 10 min · Soglia di superamento 80%
- Laboratorio praticoLab — Un editor di topologia con hit testing basato sul modello · 45 min
Obiettivo: Trasforma il playground Canvas in un editor di topologia per VisualOperationsStudio. Crea le classi NodeModel ed EdgeModel con ID stabili e geometria in coordinate mondo, tieni la scena in un oggetto TopologyScene memorizzato per sessione invece che in un campo statico, e fai di RenderScene l'unico metodo che disegna. Aggiungi le conversioni ToWorld e ToScreen per l'offset di pan e il fattore di zoom correnti, poi gestisci MouseDown per fare hit testing sui limiti dei nodi in coordinate mondo e impostare Selected, MouseMove per trascinare il nodo selezionato o spostare il viewport, e MouseUp per chiudere il gesto — ciascuno cambia lo stato e poi chiama RenderScene. Aggiungi lo zoom con la rotella o con pulsanti attorno al puntatore, salta i nodi fuori dal rettangolo visibile durante il rendering, dai a chi usa la tastiera un modo per selezionare e spostare un nodo, e registra il traffico di richieste prodotto da un trascinamento più il punto a partire dal quale sposteresti il loop su JavaScript lato client. Deliverable: NodeModel, EdgeModel e un TopologyScene per sessione con ID stabili e nessuno stato statico mutabile; conversioni ToWorld e ToScreen usate per l'hit testing, così che la selezione resti corretta dopo pan e zoom; handler di MouseDown, MouseMove e MouseUp che cambiano lo stato e poi chiamano l'unico metodo RenderScene; culling del viewport che salta i nodi fuori dal rettangolo visibile, più un percorso da tastiera per selezionare e spostare; InteractionNotes.md con il traffico di richieste misurato durante un trascinamento e la soglia oltre la quale passeresti al lato client.
Modulo 6: System.Drawing.Managed su Windows, Linux, macOS, iOS e Android
Modulo 6 di Disegno e grafica in Wisej.NET — crea grafica personalizzata con Paint, CellPaint, Canvas e System.Drawing.Managed multipiattaforma. Leggi la guida della lezione e la guida al lab / esame, guarda la videoguida sul disegno managed multipiattaforma, supera la verifica delle conoscenze e completa il lab pratico in VisualOperationsStudio.
- LetturaGuida della lezione · 14 min
Rendering off-screen che gira ovunque: perché System.Drawing.Common è solo per Windows sulle versioni moderne di .NET, che cosa sono davvero il package Managed.System.Drawing e l'assembly System.Drawing.Managed, la matrice di font e grafica di Wisej.NET 4, una politica deterministica sui font e come scegliere, caso per caso, fra questa strada, ImageSharp, SkiaSharp, Aspose.Drawing e Microsoft.Maui.Graphics. Che cosa significa per uno sviluppatore .NET esperto che già costruisce schermate Wisej.NET e ora ha bisogno di grafica personalizzata — e come affrontare questo modulo.
- LetturaGuida al lab / esame · 10 min
Che cosa costruirai nel lab pratico, l'approccio suggerito e i deliverable richiesti.
- Lezione videoGenera un PNG sul server che gira anche su Linux · 14 min
Genera un PNG sul server che gira anche su Linux — una videoguida del Modulo 6, costruita passo dopo passo in VisualOperationsStudio. Parte direttamente qui nel player.
Trascrizione della narrazione
Questo modulo produce un file invece di una schermata. Operations vuole la stessa topologia come immagine da conservare, generata su un server che sotto non ha un sottosistema grafico del tipo tradizionale.
Nessuna delle tre superfici precedenti può farlo, perché a ognuna serve un controllo vivo e una sessione viva. Anche la libreria ovvia è esclusa: Microsoft ha reso il suo pacchetto di disegno classico specifico per Windows a partire da .NET 6, e l'interruttore che riabilitava gli altri sistemi è stato rimosso in .NET 7.
Tre nomi descrivono una cosa sola, e tenerli distinti ti risparmia un pomeriggio. Il pacchetto a cui fai riferimento è la distribuzione gestita, l'assembly su disco è la libreria di disegno gestita, e il namespace che il tuo codice usa è quello di sempre. È un motore di rendering gestito, non un wrapper sopra il livello grafico della piattaforma.
Il renderer prende una scena e una dimensione di output e restituisce byte. Crea un Bitmap, ottiene sopra di esso una superficie Graphics, disegna gli archi, i nodi e le etichette con pen, brush e un path, e salva il risultato in un flusso di memoria in formato portable network graphic. Nessun controllo compare da nessuna parte.
La matrice delle piattaforme vale la pena impararla a memoria. La misura dei font è gestita ovunque. Il disegno è gestito sul .NET moderno su ogni sistema operativo, e ripiega sul livello della piattaforma sul .NET Framework e nella build del designer. Non vincolare mai un deployment multipiattaforma a un target solo per Windows per far sparire un problema di disegno.
Due decisioni determinano poi se tutto questo sopravvive al deployment. Risolvi il font attraverso una catena che finisce su qualcosa che distribuisci tu, invece di dare per scontato che un font esista sull'host. E tieni esattamente una sola implementazione di disegno nel grafo dei riferimenti, perché due che risolvono gli stessi nomi di tipo sono un problema che non ti divertirà diagnosticare.
Eseguilo. L'export disegna off-screen in circa trentaquattro millisecondi senza alcun controllo coinvolto, e i byte vengono consegnati al browser come download. Limita però la dimensione richiesta: una bitmap larga quattromila pixel e alta tremila costa più o meno quarantotto megabyte prima ancora che tu abbia disegnato qualcosa.
Ora il container. Lo stesso test passa su Linux, niente si collega alla libreria grafica nativa della piattaforma, e le due immagini vengono identiche byte per byte, perché il font ha viaggiato con l'applicazione invece di essere preso in prestito dall'host.
Nel sesto lab costruisci il renderer senza controlli, gli dai una catena di fallback per i font, scarichi l'immagine dalla pagina, controlli i riferimenti in cerca di una seconda implementazione di disegno, e registri le tue evidenze su Windows e su Linux insieme a quello che implicano per i target mobile e desktop.
- LetturaEsercizio di coding con l'IA · 20 min
Costruisci il progetto VisualOperationsStudio di questo modulo con ChatGPT o Claude partendo da un prompt già pronto che indirizza il modello alla specifica del modulo, poi rivedi, esegui ed estendi quello che ti restituisce.
- VerificaVerifica delle conoscenze — Modulo 6 · 10 min · Soglia di superamento 80%
- Laboratorio praticoLab — Un renderer PNG off-screen che viaggia ovunque · 45 min
Obiettivo: Aggiungi a VisualOperationsStudio un TopologyImageRenderer che trasforma il modello di topologia in un PNG senza toccare un solo controllo Wisej. Dagli un metodo Render che riceve la scena e una dimensione di output, crea il Bitmap, ne ottiene il Graphics con Graphics.FromImage, disegna nodi, archi, etichette e una legenda con pen, brush e un GraphicsPath, e fa il dispose di tutto ciò che possiede lasciando in pace gli oggetti del chiamante. Risolvi il suo Font attraverso un metodo ResolveFont che prova una famiglia fornita dall'applicazione e ripiega su una sicuramente presente, invece di dare per scontato che un font di sistema esista; salva in un MemoryStream come PNG e passa i byte alla pagina per il download. Poi controlla i riferimenti del progetto per confermare che non stai aggiungendo System.Drawing.Common accanto all'implementazione managed di Wisej, esegui o prepara il renderer su Windows e in un container Linux, e metti per iscritto come si comporta lo stesso codice sui target iOS, Android e macOS Hybrid. Deliverable: TopologyImageRenderer senza alcuna dipendenza da un controllo Wisej, che rende tramite Graphics.FromImage dentro un Bitmap; metodo ResolveFont con una catena di fallback esplicita invece di un font di sistema dato per scontato; PNG scritto in un MemoryStream e scaricato dalla pagina, con il dispose di ogni oggetto grafico posseduto; verifica dei riferimenti che conferma l'uso di Managed.System.Drawing e l'assenza di System.Drawing.Common affiancato; CrossPlatform.md con le prove su Windows e in container Linux e le implicazioni per iOS, Android e macOS.
Modulo 7: Architettura di disegno in produzione, prestazioni e capstone
Modulo 7 di Disegno e grafica in Wisej.NET — crea grafica personalizzata con Paint, CellPaint, Canvas e System.Drawing.Managed multipiattaforma. Leggi la guida della lezione e la guida al lab / esame, guarda la videoguida sull'architettura in produzione e sul capstone, supera la verifica delle conoscenze e completa il lab pratico in VisualOperationsStudio.
- LetturaGuida della lezione · 14 min
Rendere il codice di disegno pronto per la produzione: un unico modello visuale con un livello di geometria puro e renderer separati per ciascuna superficie, la strumentazione per tempo di rendering e dimensione del payload, il profiling di un percorso disegnato contro uno off-screen, il comportamento su ridimensionamento, cambio di tema, dati vuoti e font mancante, un equivalente testuale accessibile e il capstone Visual Operations Studio. Che cosa significa per uno sviluppatore .NET esperto che già costruisce schermate Wisej.NET e ora ha bisogno di grafica personalizzata — e come affrontare questo modulo.
- LetturaGuida al lab / esame · 10 min
Che cosa costruirai nel lab pratico, l'approccio suggerito e i deliverable richiesti.
- Lezione videoUn modello, quattro renderer, misurati e messi in produzione · 14 min
Un modello, quattro renderer, misurati e messi in produzione — una videoguida del Modulo 7, costruita passo dopo passo in VisualOperationsStudio. Parte direttamente qui nel player.
Trascrizione della narrazione
Questo è il capstone. Sei moduli hanno costruito quattro superfici di rendering in Visual Operations Studio, ognuna corretta per conto suo. Spedirle significa metterle d'accordo fra loro, e dimostrare che lo siano.
Al momento ogni superficie tiene le proprie soglie, i propri colori e la propria idea di dove stiano le cose. Sposta una volta sola la linea di warning e l'immagine esportata contraddice in silenzio la schermata da cui è stata generata. Non è un difetto di rendering; sono quattro copie della stessa regola di business.
Il rimedio sono tre livelli. Un modello visuale tiene lo stato semantico: valori, stati, selezione. Un livello di geometria trasforma quello stato e una dimensione in forme, ed è aritmetica pura. Poi un renderer per superficie, ognuno con le primitive che gli si addicono, perché forzarli dentro un'interfaccia condivisa non aiuta nessuno.
Poi, mettiti d'accordo sui numeri prima di ottimizzare qualsiasi cosa. Un controllo disegnato dovrebbe restare sotto i cinque millisecondi circa. Un ridisegno completo del Canvas sta nell'intervallo fra sedici e cinquanta millisecondi. Un export può permettersi di essere più lento di entrambi, purché mentre gira non blocchi mai la sessione di un altro utente.
La chiamata di geometria prende il modello e una dimensione e restituisce forme, e la chiamano entrambi i renderer, così nessuno può divergere. Accanto a loro, un piccolo helper di metriche registra la durata di un render, la dimensione dell'output e quanti oggetti della scena sono stati disegnati. Senza quei tre numeri, la messa a punto è tirare a indovinare.
Poi disegna di proposito gli stati anomali. Dati vuoti, una superficie senza dimensione, un intervallo il cui minimo supera il massimo, un font che manca: ognuno di questi dovrebbe degradare in qualcosa di leggibile invece di sollevare un'eccezione. E un export fallito deve arrivare all'utente come un messaggio, non come uno spazio vuoto dove ci si aspettava un'immagine.
Cambia un valore e tutte e quattro le superfici lo seguono: il gauge disegnato, le celle disegnate, la topologia sul Canvas e l'immagine esportata. Accanto a loro sta una semplice tabella che elenca ogni lettura, ed è questo che rende l'informazione disponibile anche a chi non può usare la grafica.
Infine le evidenze. Il gauge disegnato è sceso da circa undici millisecondi a quattro, l'export da più o meno trecentodieci millisecondi a centoventotto, e la matrice di test copre Windows, Linux, i target Hybrid e tre browser. Vale anche una decisione misurata di non ottimizzare, purché sia messa per iscritto.
Il lab finale è il capstone: un solo modello dietro tutte e quattro le superfici, un helper di metriche, un'ottimizzazione che hai misurato prima e dopo, quattro percorsi degradati che falliscono con grazia, e le note che spiegano l'architettura e il confine che rispetta.
- LetturaEsercizio di coding con l'IA · 20 min
Costruisci il progetto VisualOperationsStudio di questo modulo con ChatGPT o Claude partendo da un prompt già pronto che indirizza il modello alla specifica del modulo, poi rivedi, esegui ed estendi quello che ti restituisce.
- VerificaVerifica delle conoscenze — Modulo 7 · 10 min · Soglia di superamento 80%
- Laboratorio praticoLab — Capstone: Visual Operations Studio · 45 min
Obiettivo: Completa il capstone di VisualOperationsStudio mettendo un unico modello dietro tutte e quattro le superfici. Ristruttura il progetto in cartelle Models, Geometry, Renderers e adapter Wisej, così che l'indicatore disegnato, le celle di griglia disegnate a mano, la topologia su Canvas e l'export PNG leggano tutti lo stesso OperationsModel e condividano il livello di geometria puro, senza stato di business duplicato per renderer. Aggiungi un helper RenderMetrics che registra la durata del rendering, la dimensione del bitmap prodotto e il numero di oggetti della scena disegnati, e usalo per confrontare l'indicatore disegnato sul server con il renderer off-screen prima e dopo un'ottimizzazione che scegli e motivi. Metti alla prova i percorsi di errore — dati vuoti, superficie a dimensione zero, intervallo non valido, font mancante — così che ciascuno degradi in un segnaposto leggibile invece che in un'eccezione, aggiungi una tabella accessibile che elenca ogni valore mostrato dalla grafica e scrivi le note del capstone su architettura, confine browser/server e matrice di test. Deliverable: livelli Models, Geometry, Renderers e adapter con un solo OperationsModel che guida tutte e quattro le superfici; helper RenderMetrics che registra durata del rendering, dimensione del bitmap e numero di oggetti disegnati per ciascuna superficie; misure prima e dopo per un'ottimizzazione, con la motivazione della scelta; percorsi di errore per dati vuoti, dimensione zero, intervallo non valido e font mancante che degradano invece di sollevare eccezioni; CapstoneNotes.md con l'architettura, il confine server/browser, la matrice di test e una tabella di dati accessibile.