RAVAL — Roberto Avalonia Library
Versione 2.10.0 · .NET 10 · Avalonia 12.1.4
RAVAL.dll è la libreria del libro «AVALONIA SOLO IN CODICE» di Ing. Roberto Arato: le funzioni in più per Avalonia, soprattutto grafiche e di conversione. Le estensioni fluenti per costruire le interfacce in C# senza XAML, gli stili scritti in codice, un grafico a curve con i marcatori, le tabelle e gli elenchi di proprietà, le figure a qualunque risoluzione, i numeri con i prefissi SI e i colori, il log e le impostazioni in JSON o INI di ogni applicazione, e un server di API JSON su Kestrel. Dipende da .NET, da Avalonia e dal framework ASP.NET Core dell'SDK, tutti con licenza MIT.
Quello che sta in RAVAL serve a molti programmi e si spiega in un capitolo: niente di legato a un dominio (le microonde stanno in ASTRIP, non qui), niente di grande da nascondere dentro una scatola.
Cosa contiene
Tutto sta nel namespace RAVAL: basta using RAVAL;.
| Cartella | Classi | Cosa fanno | Documento |
|---|---|---|---|
RAVAL\UI | RAva | estensioni fluenti: disposizione (Margin, Row, Children...), testo e cornici (FontSize, Bold, Border, Padding, Background...), pannelli pronti (HStack, VStack, Grid), eventi senza lambda (OnClick, OnTextChanged, OnEnter, OnChecked, OnSelectionChanged, Every, OnThemeChanged), voci dei menu (OnClick, HotKey), accessibilità (AutomationName), colori (Brush, Resource, ThemeBrush) | DOC/RAva.md |
RAVAL\UI | RThemes | i colori dell'applicazione per il tema chiaro e lo scuro, scritti a coppie | DOC/RAva.md |
RAVAL\UI | RStyles, RAva (aspetto) | stili globali in codice senza lambda, l'insieme pulito pronto Clean, il colore d'accento; titoli di sezione, riquadri, barre, bottoni piatti, caselle di codice (Caption, Card, Bar, ToolbarButton, CodeBox) | DOC/RGrafica.md |
RAVAL\UI | RTable, RVirtualTable, RPropertyList | tabella con ordinamento e selezione; tabella virtualizzata per centomila righe con CSV, ordine e filtro; elenco nome = valore modificabile, anche dalle proprietà di un oggetto | DOC/RGrafica.md |
RAVAL\Data | RNode, RNodeKind | l'albero dei dati di un JSON o di un XML, senza Avalonia: letture per percorso con il predefinito, modifica, scrittura, da un formato all'altro | DOC/RDati.md |
RAVAL\UI | RDialog, RDialogBox, RDialogKind, RFiles | dialoghi in una riga con await (informazione, avviso, errore con i dettagli, conferma, testo, scelta); selettori di file e cartelle che rispondono con il percorso; file di testo letti e scritti interi | DOC/RDialoghi.md |
RAVAL\UI | RClipboard, RDrop | appunti in una riga (testo, tabelle da e verso un foglio di calcolo, immagini, file); file e testi trascinati su un controllo, filtrati per nome | DOC/RDialoghi.md |
RAVAL\UI | RTree, RTreeNode | albero in codice con le voci costruite all'apertura: JSON, XML, cartelle, figli letti da un caricatore, scelta, ricerca, percorso | DOC/RGrafica.md |
RAVAL\Graphics | RChart, RSeries, RLimit, RTicks | grafico a curve disegnato a mano: assi tondi, ascissa logaritmica, asse destro, legenda, limiti, marcatori col mouse | DOC/RGrafica.md |
RAVAL\Graphics | RSmithChart, RPolarChart, RBarChart, RHeatMap, RComplexSeries | carta di Smith con zoom, marcatori e cerchi; grafico polare anche in dB per le antenne; barre affiancate o impilate; mappa di colori | DOC/RGrafica.md |
RAVAL\RF | RSmithMath, RCircle | Γ, Z, VSWR e i cerchi della carta di Smith: griglia, stabilità, guadagno, rumore (senza Avalonia) | DOC/RGrafica.md |
RAVAL\Graphics | RImage, RFormat, RColor, RCsv | controlli in PNG a qualunque dpi; numeri con i prefissi SI scritti e riletti; colori mescolati, esadecimale, luminanza, tavolozza delle curve; colonne, curve e tabelle in CSV e ritorno | DOC/RGrafica.md |
RAVAL\App | RLog, RLogLevel, RLogEntry, RLogView (in UI) | il log dell'applicazione: livelli, colori per livello o per riga (console a 16 colori o a 24 bit), file che ruota, un thread suo che scrive, la riga di avvio, le eccezioni che nessuno prende; la finestra del log dal vivo | DOC/RApp.md |
RAVAL\App | RTheme, RThemeMode, RLang | il tema chiaro/scuro/sistema ricordato, con menu e bottone; le lingue con un file per lingua e i testi che cambiano da soli | DOC/RApp.md |
RAVAL\App | RSettings, RJsonSettings, RIniSettings, RWindowMemory, RRecentFiles | le impostazioni in JSON o INI con le stesse chiamate: letture con il predefinito, chiavi mancanti aggiunte al file, salvataggio ritardato e sicuro, commenti INI conservati; la finestra che riapre dov'era; i file recenti nel menu | DOC/RApp.md |
RAVAL\HTTP | RServer, RRequest, RResponse, RHttpError | server di API JSON su Kestrel: percorsi collegati a metodi con un nome; avvio senza await (Start), con un thread (Run) o con await | DOC/RServer.md |
Il tutorial completo, dal linguaggio C# (con un capitolo intero su thread, Task e await) fino a un cruscotto con grafici disegnati a mano, a un server di API e alla finestra di uno strumento di misura fatta con i pezzi pronti della 2.1 (capitolo 15) e al log con le impostazioni (capitolo 16), è DOC/TUTORIAL.md: è il testo di partenza del libro. Le sue figure sono in DOC\immagini e le disegna il codice di ESEMPI_RAVAL.
Il riferimento di tutte le classi e di tutti i metodi, in inglese come la libreria, è DOC/API.md e, per il sito, la pagina unica DOC\sito\raval-api.html (stili dentro, tema chiaro e scuro, indice a sinistra). Non si scrive a mano: lo genera DOC_RAVAL dalle classi pubbliche di RAVAL.dll e dai commenti /// di RAVAL.xml, quindi dice sempre quello che fa il codice. Va rigenerato dopo ogni modifica alla libreria; DOC_RAVAL restituisce 2 se un membro pubblico non ha il commento. Ogni classe è divisa in costruttori, campi, proprietà, eventi e metodi, perché anche gli eventi (RChart.MarkersChanged) e le costanti (RStyles.Monospace) sono parte di quello che si usa; le estensioni di RAva sono divise per argomento (tabella Argomenti in DOC_RAVAL\Riferimento.cs: un nome che non c'è finisce in «Other», e lì si vede che va aggiunto).
La soluzione
RAVAL\
├─ RAVAL.slnx
├─ Directory.Build.props la versione, una sola per tutti i progetti
├─ RAVAL\ la libreria (RAVAL.dll)
├─ TEST_RAVAL\ la prova: estensioni e temi
├─ ESEMPI_RAVAL\ gli esempi del tutorial, che disegnano le figure
├─ DOC_RAVAL\ scrive il riferimento (DOC\API.md) e il sito (DOC\sito)
├─ DOC\ tutorial, schede delle classi, figure, riferimento, il sito generato
└─ deploy\ il virtual host di Apache di raval.aratoingegneria.it
dotnet build RAVAL.slnx
dotnet run --project TEST_RAVAL # 0 se tutte le prove passano; i PNG in bin\...\uscita
dotnet run --project ESEMPI_RAVAL # rigenera tutte le figure in DOC\immagini
dotnet run --project ESEMPI_RAVAL -- --finestra # il primo programma del tutorial, con la finestra vera
dotnet run --project ESEMPI_RAVAL -- --csharp # gli esempi del capitolo 1, il linguaggio
dotnet run --project ESEMPI_RAVAL -- --thread # gli esempi del capitolo 2: thread, Task, await
dotnet run --project ESEMPI_RAVAL -- --copertina <cartella> <immagini> # copertina del libro, 300 dpi
dotnet run --project DOC_RAVAL # rigenera il riferimento e il sito; 0 se ogni membro ha il commento
dotnet run --project DOC_RAVAL -- --anteprima # il sito su http://localhost:8090/, come sul server
Il sito, raval.aratoingegneria.it
DOC_RAVAL scrive in DOC\sito tutto il sito, in italiano (pagina.html) e in inglese (pagina-en.html):
- home, funzioni, documentazione, schermate e download;
- il tutorial, le schede e il README convertiti dal Markdown (
DOC_RAVAL\Markdown.cs, con le ancore di GitHub, così gli indici funzionano); - il riferimento delle API;
- il tutorial in PDF, stampato da Edge senza finestra dalla pagina stessa, con il foglio di stile per la stampa;
- il pacchetto da scaricare: la DLL con la documentazione;
- gli esempi dei libri «Avalonia solo in codice». Li prepara la sessione AVA_BOOK in
..\AVA_BOOK\PACCHETTI, insieme apacchetti.json(file, lingua, titolo, descrizione, volume); il generatore li copia indownload\libri\e li mostra nella pagina della loro lingua. Se la cartella non c'è, la sezione non c'è.
I sorgenti di RAVAL non sono pubblici (decisione di Roberto del 6/11/2026): sul sito si scaricano solo dietro la login delle statistiche.
- Il pacchetto dei sorgenti va in
DOC\sito\riservato\, fuori da git; RavalSito serve/riservato/solo con utente e password, e lo elenca nella pagina/stat/. - Gli esempi dei libri devono usare la DLL, non i sorgenti. Il generatore apre ogni zip: uno che contiene sorgenti della libreria (un
.cssotto una cartellaRAVAL/) non va nella pagina pubblica ma inriservato\libri\. - Nessuna pagina pubblica nomina i file riservati.
La versione, le classi e le firme le prende dalla DLL, quindi il sito dice sempre quello che c'è. Le figure per il web (al massimo 1600 pixel) le scrive ESEMPI_RAVAL in DOC\sito\immagini mentre disegna quelle dei libri. I pacchetti e il PDF (DOC\sito\download\) non stanno in git: si rifanno a ogni generazione.
Sul server (nex-sito, aratoingegneria.it) i file del sito stanno in /opt/raval-sito/www e li serve RavalSito, un piccolo servizio come quello di NEX. Il servizio conta pagine viste e scaricamenti, anche per paese, lato server, senza cookie e senza script nelle pagine; le statistiche si vedono in /stat/, con utente e password. Usa la RLIB, quindi è un progetto privato a parte, ..\RAVAL_SITO, con il suo LEGGIMI. Davanti c'è Apache come proxy (deploy\raval.aratoingegneria.it.conf e la copia HTTPS), con il certificato di Let's Encrypt che si rinnova da solo. Per pubblicare, dopo aver generato il sito:
tar -C DOC/sito -czf - . | ssh nex-sito "tar -xzf - -C /opt/raval-sito/www"
Il servizio serve i file nuovi subito, senza riavvio.
TEST_RAVAL e ESEMPI_RAVAL disegnano senza schermo: Avalonia.Headless con il disegno vero di Skia (UseHeadlessDrawing = false). TEST_RAVAL legge l'immagine della finestra con CaptureRenderedFrame; ESEMPI_RAVAL ridisegna la finestra con RImage.Render ad almeno 300 dpi e 2400 pixel di larghezza, la regola delle figure dei libri. TEST_RAVAL controlla le proprietà impostate da ogni estensione (anche l'errore chiaro di quelle usate sul controllo sbagliato), che ogni evento arrivi al metodo con il valore giusto, che RAva.Every scatti, e che i colori legati con Resource (dati con RThemes) cambino da soli tra tema chiaro e scuro. Per RServer prova percorsi, parametri, corpo JSON, codici di errore, l'avvio con Run in un thread e i metodi sul thread dell'interfaccia, chiamando davvero il server con un HttpClient.
Usarla come DLL
Nella stessa soluzione basta il riferimento al progetto:
<ProjectReference Include="..\RAVAL\RAVAL\RAVAL.csproj" />
Da un'altra soluzione si usa la DLL compilata, con HintPath:
<ItemGroup>
<PackageReference Include="Avalonia" Version="12.1.4" />
<Reference Include="RAVAL">
<HintPath>..\RAVAL\RAVAL\bin\Debug\net10.0\RAVAL.dll</HintPath>
</Reference>
</ItemGroup>
- I riferimenti a una DLL non sono transitivi: il programma deve avere da sé il pacchetto
Avalonia. Per usareRServerserve anche<FrameworkReference Include="Microsoft.AspNetCore.App" />; chi non lo usa non ne ha bisogno, perché l'assembly di ASP.NET non viene mai caricato. - Con l'
HintPathuna modifica a RAVAL arriva al programma solo dopo aver ricompilato RAVAL. I binari non sono nel repository (.gitignore): su un PC nuovo si compila primaRAVAL.slnx. - Accanto a
RAVAL.dllc'èRAVAL.xml, la documentazione dei membri per i suggerimenti dell'editor.
Regole del codice
Le stesse del libro, e valgono per ogni file:
- niente lambda (
x => ...,delegate, gestori anonimi): metodi con un nome, piccole classi con i campi del contesto,foreachal posto di LINQ con predicati. I membri con corpo a espressione (public int X => 5;) vanno bene; - un commento su ogni funzione (
/// <summary>per le pubbliche), che dice cosa fa e perché; - commenti in riga allineati alla colonna 90;
- in
RAVAL\UIle righe stanno entro 80 caratteri (i commenti a fine riga alla colonna 90 e l'intestazione a parte): il libro mostra quei file come figure, e una riga più lunga verrebbe tagliata; - l'intestazione con il logo in testa a ogni sorgente, con
NameeDescriptionaggiornati; la riga del copyright diceCopyright (c) 2026 Ing. Roberto Arato. MIT License: see the LICENSE file.nella libreria,... Licenza MIT: vedi il file LICENSE.in esempi e prove (non «Tutti i diritti riservati», che contraddirebbe la licenza: chi copia un solo file deve sapere a quali condizioni può usarlo); - la libreria è in inglese: nomi, commenti e messaggi di errore, come Avalonia; un'estensione ha il nome della proprietà che imposta. Restano in italiano i documenti in
DOC\e il codice diESEMPI_RAVALeTEST_RAVAL, che servono al libro italiano; - 0 avvisi alla compilazione.
Versione
Una sola, in Directory.Build.props (<Version>), per la libreria e per i programmi di prova. Si alza all'inizio di una serie di modifiche, non alla fine: così la versione stampata da TEST_RAVAL dice subito se il codice che gira è quello nuovo. Il numero stampato è solo la versione, senza l'impronta del commit (IncludeSourceRevisionInInformationalVersion spento). Anche questo README e il tutorial riportano lo stesso numero.
- 1.0.0: prima versione (estensioni, visualizzatore HTML, classi PDF).
- 1.1.0: RAVAL tiene solo gli strumenti per scrivere codice Avalonia. Visualizzatore HTML, classi PDF e miniature dei PDF sono usciti dalla libreria, e con loro i capitoli 12 e 13 del tutorial.
- 1.2.0: testo e cornici (
Corpo,Grassetto,Colore,Bordo,Imbottitura,Sfondo...), pannelli pronti (InRiga,InColonna,Griglia), eventi senza lambda (AlCambioTesto,AlInvio,AlSpunta,AlCambioSelezione,Ogni,AlCambioTema), colori (RAva.Pennello,RTemi). RAva è divisa per gruppo in più file (partial); nel tutorial il capitolo 12 le spiega con una rubrica. - 1.3.0:
RServer(API JSON su Kestrel) conRRichiesta,RRisposta,RErroreHttp; avvio senza await (Avvia/Ferma), con un thread (Esegui) o con await. Nel tutorial il capitolo 2 nuovo su thread, Task eawait(esempi--threade sei diagrammi) e il capitolo 14 sul server. - 1.3.1: i sorgenti di
RAVAL\UIportati entro 80 caratteri per riga, per le figure del libro; nessuna funzione cambiata. - 1.3.2: il commento di
AlInvioe il tutorial dicono come si comporta davvero Invio in una TextBox (una riga: passa;AcceptsReturn: va a capo e lo segna gestito) e l'ordine inverso dei gestori della stessa fase; misurati con la tastiera finta inTEST_RAVAL\ProveInvio.cs. Nessuna funzione cambiata. - 1.3.3: licenza MIT (file
LICENSE,PackageLicenseExpressionnel.csproj, README, tutorial); il codice si scarica da https://raval.aratoingegneria.it. Nessuna funzione cambiata. - 1.3.4:
SfondoeImbottituravalgono anche per ilTextBlock, che in Avalonia 12 haBackgroundePadding(segnalato da AVA_BOOK); prima davano l'errore «non ha questa proprietà». - 1.3.5: le intestazioni di tutti i sorgenti dicono «Licenza MIT: vedi il file LICENSE» al posto di «Tutti i diritti riservati». Nessuna funzione cambiata.
- 1.3.6: voci dei menu (
RAVAL\UI\RAvaMenu.cs, chieste da AVA_BOOK):AlClicper ilMenuItemeTasto("Ctrl+S"), che mette insiemeInputGestureeHotKey; provate inTEST_RAVAL\ProveMenu.cs. - 1.3.7: accessibilità (
RAVAL\UI\RAvaAccesso.cs, chiesta da AVA_BOOK):Nome(s)per il nome che annuncia il lettore di schermo;Contenuto("_Prenota")mette anche il nome «Prenota», perché Avalonia lo annuncerebbe con il trattino. Provate inTEST_RAVAL\ProveAccesso.cs. - 1.3.8: il titolare del copyright è Ing. Roberto Arato: intestazioni dei sorgenti,
LICENSE,<Copyright>inDirectory.Build.props, README. Nessuna funzione cambiata. - 1.3.9: anche
<Company>e i testi (README, tutorial) nominano solo Ing. Roberto Arato; il nome della ditta resta nel logo e in copertina. Nessuna funzione cambiata. - 2.0.0: RAVAL è in inglese per tutti, anche per il libro italiano: classi, estensioni, commenti dei sorgenti e messaggi di errore. Le estensioni hanno il nome della proprietà che impostano (
Margin,Content,Background...), gli eventiOn...(OnClick,OnEnter...), i pannelli prontiHStack,VStack,Grid; le classi sonoRThemes,RRequest,RResponse,RHttpError. Il JSON degli errori è{ "error": "..." }. Non è compatibile con la 1.x: la tabella dei nomi vecchi e nuovi è in DOC/NOMI_2.0.md. Il riferimento delle classi per il sito lo generaDOC_RAVAL. - 2.1.0: le funzioni grafiche e di conversione (chieste da ASTRIP):
RChartconRSeries,RLimite i marcatori al clic,RTicks(divisioni 1-2-5),RImage(figure a qualunque dpi),RFormat(prefissi SI scritti e riletti),RColor(mescolare, esadecimale, luminanza, tavolozza),RTableeRPropertyList,RStyles(stili in codice senza lambda,Clean,Accent) e inRAvaCaption,Card,Bar,ToolbarButton,CodeBox. Provate inTEST_RAVAL/ProveGrafica.cs; scheda in DOC/RGrafica.md. - 2.1.1:
RCsv: le colonne di numeri, le curve di unRCharte le righe di unaRTablein CSV, con le virgolette di RFC 4180, e la lettura. - 2.1.2: una curva di
RChartsenza nome si disegna ma resta fuori dalla legenda e dalle letture dei marcatori (le nuvole del Monte Carlo). - 2.1.3:
RTablenon esce più dall'array quando le colonne cambiano dopo le righe: le celle che mancano restano vuote (trovato da ASTRIP, che rifà le colonne della tabella dei marcatori). - 2.1.4:
RImagedisegna a 96 dpi su una bitmap già grande quanto la risoluzione chiesta, con la scala come trasformazione: a 300 dpiRenderTargetBitmapperdeva le scritte disegnate dopo un ritaglio (la legenda e i marcatori diRChart).RChartlascia a destra lo spazio per l'ultima etichetta dell'asse. - 2.1.5:
RImage.SavePngscrive nel PNG la risoluzione vera (blocco pHYs in pixel al metro, con il suo CRC), come chiedono i libri;RImage.SetDpieRImage.Dpiper i PNG fatti altrove. - 2.1.6: documentazione allineata alla libreria. Il riferimento (
DOC_RAVAL) scrive anche gli eventi e i campi pubblici, che prima mancavano, e mette i pezzi pronti diRAvasotto «Ready-made look»; il tutorial ha il capitolo 15 nuovo, uno strumento di misura conRChart,RTable,RPropertyList,RFormat,RCsv,RImageeRStyles(esempioESEMPI_RAVAL\Esempi\Strumento.cs, figure15_strumento), e gli inciampi passano al capitolo 16. Nessuna funzione della libreria cambiata. - 2.2.0: log e impostazioni, scritti da zero con licenza MIT (le idee vengono dal modo di lavorare dei programmi dell'autore, il codice no):
RLogcon i livelli, i colori (sulla console e nella finestra, anche a 24 bit e per singola riga), il file che ruota e un thread suo,RLogViewper vederlo dal vivo,RSettingsin JSON (RJsonSettings) o INI (RIniSettings) con le stesse chiamate,Rememberper la finestra che riapre dov'era,RRecentFilesper i file recenti;RStyles.Apply(controllo)per gli stili di un solo controllo. Prove inTEST_RAVAL\ProveApp.cs, scheda DOC/RApp.md, capitolo 16 del tutorial (esempioRegistro.cs); gli inciampi passano al 17. - 2.3.0: l'albero.
RTreeNode(testo, valore, chiave del percorso, figli aggiunti o letti da un caricatore la prima volta che servono;FromJson,FromXml,FromFolder) eRTree, unTreeViewriempito in codice che costruisce le voci solo quando un nodo si apre (centomila valori JSON in meno di due decimi di secondo), con scelta,Opened,Findper percorso, filtro e casella di ricerca. Prove inTEST_RAVAL\ProveAlbero.cs, scheda DOC/RGrafica.md, capitolo 17 del tutorial (esempioAlbero.cs); gli inciampi passano al 18. - 2.4.0: i dati dell'albero senza Avalonia.
RNode(cartellaData) legge JSON e XML in una classe sola, con le letture per percorso e predefinito (GetInt("server.port", 5080),"server/@port"), la modifica (Set,Add,Remove), la scrittura (ToJson,ToXml,Save) e il passaggio da un formato all'altro.RTreeNode.FromJsoneFromXmlpassano daRNode, che resta nelTagdi ogni nodo (prima c'era ilJsonNodeo l'XElement); nuoviRTreeNode.FromNodeeRTree.LoadNode. Scheda DOC/RDati.md, paragrafo 17.3 del tutorial, proveDatiinTEST_RAVAL\ProveAlbero.cs. - 2.5.0: dialoghi e file in una riga.
RDialog(Info,Warning,Errorcon i dettagli dell'eccezione e la riga nel log,Confirm,Ask,Choose; testi cambiabili per un'altra lingua) con la finestraRDialogBox, la cui risposta (Answer) vale −1 per Esc e crocetta.RFilesapre i selettori di file e cartelle con i tipi scritti «nome|.a;.b» e risponde con il percorso;ReadTexteWriteTextper i file di testo. Scheda DOC/RDialoghi.md, capitolo 18 del tutorial (esempioAppunti.cs), prove inTEST_RAVAL\ProveDialoghi.cs; gli inciampi passano al 19. I commenti///diRTreeeRTreeNodeora stanno anche loro negli 80 caratteri diUI. - 2.5.1: manutenzione, senza funzioni nuove.
RImagerispetta l'opacità dei controlli: prima un valore attenuato o una riga di stato al 75% uscivano pieni nelle immagini.RChart.Culture(predefinita: invariante) fa scrivere assi e marcatori con il punto, come tabella e CSV; prima usava la virgola del computer.RSettingsin JSON scrive gli accenti come sono, non comeà.- Le figure di
ESEMPI_RAVALescono ad almeno 300 dpi e 2400 pixel (prima 96 dpi, sotto la regola dei libri), e gli esempi dei componenti hanno lo stileClean: i bottoni della barra non sono più grigi. - Prove in
TEST_RAVAL\ProveCorrezioni.cs.
- 2.6.0: appunti e trascinamento.
RClipboard: testo, tabelle con le tabulazioni da e verso un foglio di calcolo (SetTable,GetTable,Tsv,Cells), immagini, file come percorsi.RDrop: i file lasciati su un controllo arrivano a un metodo, solo quelli dei modelli («*.csv»); il puntatore dice subito se il controllo li accetta, e la classedrop(condropareainRStyles.Clean) colora il riquadro. Scheda DOC/RDialoghi.md, capitolo 19 del tutorial (esempioScambio.cs), prove inTEST_RAVAL\ProveAppunti.cs; gli inciampi passano al 20. - 2.7.0: tabelle grandi e oggetti.
RVirtualTable: unListBoxvirtualizzato con colonne a larghezza fissa.LoadCsv, ordine per valore o alfabetico, filtro, scelta sempre riferita aRows. Centomila righe si aprono in 0,3 s e si ordinano in 0,2.RPropertyList.Show(oggetto): le proprietà pubbliche, modificabili, riscritte nell'oggetto con la conversione al tipo,Rejectedper i testi che non si convertono, attributi diSystem.ComponentModel.RFormat.TryParse, eParseche legge «10 MHz» anche senza unità indicata.- Capitolo 20 del tutorial (esempio
Archivio.cs), prove inTEST_RAVAL\ProveVirtuale.cs; gli inciampi passano al 21.
- 2.8.0: gli altri grafici.
RSmithCharteRPolarChartvengono dal simulatore ASTRIP (MIT), tradotti e completati: zoom e spostamento della vista, marcatori con frequenza, Z e VSWR, cerchi colorati, esportazione a 300 dpi; il polare in dB, con lo zero in alto e il verso orario per i diagrammi d'antenna.RSmithMath(cartellaRF, senza Avalonia): Γ, Z, VSWR, i cerchi della griglia, stabilità, Rollett, guadagno unilaterale e rumore.RBarChart, barre affiancate o impilate;RHeatMap, la mappa di colori con quattro scale.- Capitolo 21 del tutorial (esempio
GraficiRF.cs), prove inTEST_RAVAL\ProveGraficiRF.cs; gli inciampi passano al 22.
- 2.9.0:
RChartfa anche il plotter XY e il registratore.RSeries.Style(linea, punti o tutti e due) con ascisse in qualunque ordine;Atper bisezione.TimeAxiscon le divisioni su tempi tondi (RTime);MinXeMaxX.RLiveSeriesper i dati dal vivo da qualunque thread, ridisegnati a lotti, con la finestra che scorre.- Zoom con la rotella, spostamento trascinando, doppio clic per tornare: il marcatore si mette al rilascio di un clic fermo.
- Le etichette d'ascissa che si toccherebbero si saltano; nella legenda le serie a punti hanno un pallino.
- Paragrafo 21.4 del tutorial (esempio
Registratore.cs), prove inTEST_RAVAL\ProveCurve.cs.
- 2.10.0: tema e lingue, scritti da zero (le idee di RTRANSLATE, non il codice).
RThemes.Standard(), la tavolozza grafite di ASTRIP resa standard.RTheme: chiaro, scuro o come il sistema, ricordato inRSettings, menu e bottone sole/luna, cambio senza riavviare.RLang: un file per lingua (JSON o INI viaRSettings),Tcon il testo predefinito e le chiavi mancanti aggiunte al file,Trper i controlli che cambiano lingua da soli, i testi di RAVAL già in italiano.- Paragrafi 16.6 e 16.7 del tutorial, scheda DOC/RApp.md, prove in
TEST_RAVAL\ProveLingue.cs.
Note per chi ci lavora
- Nel file XML dei commenti una matrice si scrive
System.Double[0:,0:], nonSystem.Double[]: un generatore che trattadouble[,]comedouble[]non trova il commento diRHeatMap.SetValues.DOC_RAVALscrive le dimensioni, e nelle firmedouble[,]. - Senza schermo
CaptureRenderedFramedà solo i pixel della finestra, cioè 96 dpi, qualunque sia la risoluzione voluta: per le figure dei libri si ridisegna la finestra conRImage.Render. E un disegno a mano dell'albero visuale deve applicare l'Opacitydi ogni elemento (PushOpacity): non la applica nessun altro, e le cose attenuate escono piene. - Un indicizzatore (
this[...]) nel file XML dei commenti ha i tipi dei parametri nell'identificatore («P:RAVAL.RNode.Item(System.String)»), come un metodo, e la riflessione lo chiamaItem:DOC_RAVALli aggiunge, se no l'indicizzatore risulta senza commento e la firma esce come «Item». - Senza schermo i menu non si vedono se non si mette
Popup.ShouldUseOverlayLayer = truein uno stile: lo faESEMPI_RAVAL\Program.cs. - La scorciatoia di un
MenuItemvuoleHotKey, e la voce messa conItems.Add:InputGesturescrive soltanto il tasto; conItemsSourcele voci di un sottomenu chiuso non sono ancora nell'albero eHotKeynon scatta (vediDOC/RAva.md). - Il colore di
Resourcecambia solo dopo un giro del dispatcher: in una prova senza schermo, dopo aver cambiatoRequestedThemeVariantbisogna far girareDispatcher.UIThread.RunJobs()prima di leggere la proprietà (vediTEST_RAVAL\Prove.cs). - Senza schermo i
DispatcherTimerscattano solo nel ciclo vero:RunJobs()non basta, serveDispatcher.UIThread.PushFramefermato da un altro thread (classeAttesainTEST_RAVAL\Prove.cs). - Le estensioni su proprietà che stanno su classi diverse (
FontSize,Padding,Background...) valgono per ogniControle guardano il tipo vero; su un controllo che non ha la proprietà lancianoInvalidOperationExceptioncon scritto per chi valgono, invece di non fare niente. Stop()del server chiamato dal thread dell'interfaccia si bloccava per sempre quando eraStopAsync().GetAwaiter().GetResult(): ASP.NET torna sul contesto di chi chiama. Ora èTask.Run(StopAsync)...: vediDOC/RServer.mde il §2.9 del tutorial.- La versione 1.0.0 nella storia del repository contiene ancora le classi PDF e l'HTML. Se il repository diventa pubblico, quella storia va tolta prima (repository nuovo dalla 1.1.0).
Licenza
MIT (file LICENSE): Copyright (c) 2026 Ing. Roberto Arato. Nei testi, nel copyright e nelle proprietà dell'assembly (Authors, Company, Copyright) compare solo Ing. Roberto Arato; il nome della ditta resta soltanto nel logo e in copertina.
RAVAL accompagna un libro pubblico, e i lettori devono poter usare il codice nei loro programmi, anche commerciali, come fanno con Avalonia, che ha la stessa licenza. L'unico obbligo è conservare la nota di copyright e il testo della licenza nelle copie del codice. Il codice di RAVAL e degli esempi del libro si scarica da https://raval.aratoingegneria.it.
Restano fuori da RAVAL, e privati, i componenti di casa che non servono a scrivere codice Avalonia (visualizzatori, generatori di documenti): la licenza MIT vale solo per quello che sta in questo repository.