Windows Forms
Interessante post che spiega come sviluppare servizi Windows che espongono eventi visibili da applicazioni di utente (su Windows7 e Vista il check 'Allow this service to interact with desktop' non serve)
Questo il link al post.
A volte torna utile l’utilizzo del controllo Tab senza visualizzare l’header del controllo per fare in modo di visualizzare o nascondere dei controlli. Come indicato su questo post, è possibile crearsi il proprio controllo ereditando dal TabControl e facendo l’override del WndProc: public class CustomTabControl : TabControl { protected override void WndProc(ref Message m) { if (m.Msg == 0x1328 && !DesignMode) ...
Grazie a NHunspell e ai dizionari di OpenOffice è facile dotare le nostre applicazioni di funzionalità di spell-check (controllo esattezza parole) e sinonimi. Dopo aver letto questo articolo e avendo visto che esistono i dizionari in italiano, ho fatto un po di prove rimanendo sorpreso dalla facilità di implementazione. E’ possibile controllare l’esattezza delle parole: … e controllare significato e sinonimi: A questo link potrete trovare i dizionari in italiano, mentre a questo link il mio progetto di esempio:
Prendendo spunto da un articolo trovato in rete, ecco come ottenere l’effetto calamita che utilizza Skype (provate ad avvicinare la finestra di skype ad un bordo, quando sarete nei pressi questa si ‘aggancia’): private void Form1_LocationChanged(object sender, EventArgs e)
{
int minMargin = 25;
if (this.Left < minMargin)
this.Left = 0;
else if (this.Right > (Screen.PrimaryScreen.Bounds.Width - minMargin))
this.Left = Screen.PrimaryScreen.Bounds.Width - this.Width;
if (this.Top < minMargin)
...
Dalle mie indagini non c’è una classe .Net per determinare se si è su un SO a 64bit… possibile?? Girando sui vari forum ho trovato queste tre alternative (ma solo 2 mi rispondono che sono a 64 sul mio Vista x64 con sp2 appena fatto…) Metodo 1: IntPtr 1: public static bool Is64BitSimple()
2: {
3: if (IntPtr.Size == 8)
4: ...
Interessante post riguardante il multi-threading nel mondo windows form (classico e WPF) che prende in esame 5 tecniche per evitare il fatidico messaggio: “The calling thread cannot access this object because a different thread owns it”. Per quanto riguarda windows form penso userò spesso questo semplice e conciso: 1: // WinForm
2: private void OnConnectivityChanged(object sender, ConnStatusInfoEventArgs statusInformation)
3: {
4: this.Invoke(new System.Windows.Forms.MethodInvoker(delegate()
5:...
Dopo un po di vicissitudini sono riuscito finalmente a provare un po i webservices di Virtual Earth all'interno di una mia windows form. La documentazione è abbastanza esauriente, ma io un po di casino sono riuscito a farlo ugualmente :).... il problema è attivare un account di test e configurare l'ambiente. Ecco i passi che ho seguito: con il mio account live mi sono attivato un "Developer account" a questo indirizzo. dopo aver attivato l'account (vi verrà inviata una mail di attivazione) bisogna testare se è tutto...
Un setup creato con Nullsoft installer che lancia l'installazione di slqexpress solo se non presente.
Ho specificato un po di opzioni che cmq si possono personalizzare (vedi ExecWait ... )
OutFile "SQLExpress2005Setup.exe"
Section
SectionEnd
Function .onInit
...
Interessante dll con sorgenti per evolvere le ns. classiche Messagebox. Lo trovate a questo indirizzo.
Tool gratuito di Microsoft che ci aiuta con WMI.
Clicca qui per scaricare.
Dato che tutte le sante volte che devo usarlo perdo 10 minuti a cercarlo eccolo che me lo appunto e magari torna utile anche a voi: http://timestamp.verisign.com/scripts/timestamp.dll
Mi è stato chiesto da un grafico se in windows form si riusciva a fare una splash screen un po particolare: in pratica era un rettangolo in trasparenza con ombra, con sopra del testo non opacizzato... + altre cosucce (tipico da richiesta dei grafici: questo si può fare?... questo si può mettere?...) Ci ho provato ed in windows forms non è possibile (magari lo è ma non è così semplice come farlo in wpf) Ecco il codice d'esempio: 1 <Window x:Class="Splash.Window1"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
...
Nel progettino che sto iniziando a realizzare voglio provare ad utilizzare le nuove classi del framework 3.5 che permettono di realizzare soluzioni a plugins. Per chi volesse iniziare come me da 0 ecco alcuni link dai quali partire: guide "passo a passo": How To: Build an Add-In using System.AddIn Everything you need to know to get started with System.AddIn MSDN Blog del team Samples e altro su CodePlex
Leggendo i tempi che ha misurato sto tizio, mi sono chiesto quale possa essere il peso della validazione dell'xml rispetto ad uno schema dato. Ecco i risultati che ho ottenuto considerando i files: FileSmall: 60 Kb. FileBig: 15.320 Kb. Entrambi i files non hanno errori di validazione. Che dire... se non ho sbagliato qualcosa, questo dovrebbe essere il metodo piu' veloce per validare un xml, 21 secondi per validare il file da 15 mega mi sembrano tanti, ma forse nemmeno troppi... in fondo è un...
Lo so, ce ne sono un sacco, ma mi segno questo in quanto l'autore promette che è il migliore che ci sia rispetto a tanti in giro... Il codice è su Codeproject a questo indirizzo. using System.Text.RegularExpressions;
public static class TestEmail
{
public const string MatchEmailPattern =
@"^(([a-zA-Z0-9]+[\w-]*\.)*([a-zA-Z]{1}[\w-]*|[\w-]{2,}))@"
+ @"((([0-1]?[0-9]{1,2}|2{1}[0-5]{2})\.([0-1]?[0-9]{1,2}|2{1}[0-5]{2})\.([0-1]?[0-9]{1,2}|2{1}[0-5]{2})\.){1}|"
+ @"(([a-zA-Z]+[\w-]*\.)+))([a-zA-Z]{2,4}|([0-1]?[0-9]{1,2}|2{1}[0-5]{2}))$";
public static bool IsEmail(string email)
{
if (email != null) return Regex.IsMatch(email, MatchEmailPattern);
else return false;
}
}
Dato che programmo poco in Asp.Net, quando ho a che fare con spedizione delle email mi trovo sempre impreparato... Ecco un ottimo sito che segnalo: http://www.systemnetmail.com/
Segnalo la disponibilità di nuovi video introduttivi a VS2008 e framework 3.5 a questi indirizzi; http://windowsclient.net/learn/videos_linq.aspx http://windowsclient.net/learn/videos_orcas.aspx Per chi non ne avesse abbastanza, ci sono ovviamente anche quelli della serie "How do I?" di Microsoft.... buona visione!
Vi segnalo questo screencast postato su questo blog relativo ad una nuova possibilità (comodità) che avremo nell'imminentissimo Visual Studio 2008: utilizzare authentication e il role management delle web application esposte da web services in applicazione windows forms.
Un amico mi ha segnalato questa libreria che è davvero comoda e facile da usare per gestire dei templates (sostituzione di parametri in un file o stringa). La libreria C# (è stato fatto il porting da Java) è scaricabile a questo indirizzo. Ci sono esempi e tutorials oltre che al Wiki. Ecco l'esempio piu' semplice di utilizzo: 1: string template = "Il mio nome è $nome$ e ho $eta$ anni."; 2: 3: StringTemplate stringTemplate = new StringTemplate(template); 4: stringTemplate.SetAttribute("nome", "Paolo"); 5: stringTemplate.SetAttribute("eta",...
Piccolo esempio di come poter leggere gli endPoints di un App.Config WCF ClientSection client = (ClientSection)ConfigurationManager.GetSection("system.serviceModel/client"); int i = 0;StringBuilder sb = new StringBuilder(); foreach (ChannelEndpointElement endPoint in client.Endpoints){ i++; sb.AppendLine(String.Format("{0}° EndPoint: {1}", i, endPoint.Address));}txtAppConfig.Text = sb.ToString();
Ricordarsi di importare gli assembly nel progetto e utilizzare gli Using:
1: using System.Configuration; 2: using System.ServiceModel.Configuration;
Allo stesso modo è possibile leggere le altre sezioni del ns. config.
Ne ignoravo l'esistenza, adesso che mi sono informato, provato e letto, posto per ricordarmi questa classe e segnalarla a chi non la conoscesse. Eccone una breve descrizione: The contents of SecureString is protected by DPAPI ( Data Protection API ), which means it's contents is encrypted all the time. It is also pinned in memory, which means the .NET Framework doesn't move it around. It is also mutable, which means 1) it can be cleared and 2) passing it around the framework doesn't cause several copies of the sensitive information to be floating around. Sweet idea. Un esempio di utilizzo: . ...
Utili istruzioni che mi appunto per non doverle cercare sempre: . 1: // da Stream a String 2: byte[] b = MioMemoryStream.ToArray(); 3: string s = Encoding.UTF8.GetString(b); 4: 5: // da String a Stream 6: string s = "asdasdasd"; 7: byte[] b = Encoding.UTF8.GetBytes(s); 8: MemoryStream ms = new MemoryStream(b);
L'altra sera mi sono divertito nel creare un programmino che crea degli avatar in modo random. Il problema che mi son trovato a risolvere era quello di unire più immagini creandone un'altra. In pratica prendo una immagine ".jpg" (il viso con le orecchie) e sovrappongo i vari elementi (capelli, naso, ecc..) che sono ".png" trasparenti. Ecco il risultato... mi assomiglia anche (... a parte i capelli che sono molto + radi) Ecco la funzione che mi restituisce l'immagine mergiata: . 1: private Image CreaAvatar(string viso, string capelli, string occhi,...
Segnalo una libreria "FeedDotNet" .NET per leggere in modo agevole e veloce gli RSS o ATOM. La libreria è di facile utilizzo. Esempio di Binding ad una griglia: .
1: try 2: { 3: string rssLink = txtUrl.Text.Trim(); 4: Feed feed = FeedReader.Read(rssLink, new FeedReaderSettings(true)); 5: if (FeedReader.HasErrors) 6: { 7: ...
Me lo segno per non dimenticarmene. Esempio di codice per cancellare tutti i files in una directory (compreso quelle figlie):Array.ForEach<String>(Directory.GetFiles
(textBox1.Text, "*.txt", SearchOption.AllDirectories),
File.Delete);
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
Dopo la "fatica" fatta per ottenere una porzione di immagine da una più grande (vedi il precedente post)... mi sono accorto che non andava bene per WPF. Ricordo il mio obiettivo che è quello di ottenere delle singole immagini di carte da gioco da una immagine che le contiene tutte in sequenza (un po come si fa in html per intenderci) Ecco come ho risolto nella nuova versione: Prima carico l'immagine dalle risorse in questo modo: 1 string imageUri = "pack://application:,,,/Resources/carte.jpg";
2 BitmapImage imageCards = new BitmapImage(
3 new Uri(imageUri, UriKind.Absolute));
4
Mi sono fatto una funzione che ritorna una "CroppedBitmap" dato...
Ho appena guardato questo video sull'utilizzo di Blend per cotruire una interfaccia ricca.Vi consiglio la sua visione... bellissimo!
E' una tecnica usata spesso in html, quella di avere una immagine unica che ne contiene altre concatenate al suo interno. Stasera volevo affrontare con la stessa tecnica anche un gioco di carte che sto provando a fare.Ecco come ho risolto il problema di ottenere una immagine da una porzione di un altra. 1 public Bitmap GetPortionImage(Bitmap bitmap)
2 {
3 Bitmap bm = new Bitmap(50, 100);
4 Graphics g;
5 g = Graphics.FromImage(bm);
6 Rectangle portion = new Rectangle(0, 0, 50, 100);
7 ...
Questa me la devo appuntare... leggendo questo post su CodeProject ho visto una tecnica interessante per evitare lo sfarfallio in un listview. Ecco il codice: 1 class ListViewNF : System.Windows.Forms.ListView
2 {
3 public ListViewNF()
4 {
5 //Activate double buffering
6 this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
7 ...
Segnalo una serie di video su WCF per chi come me è alle prime armi. Inoltre a questo indirizzo ci sono i webcast di mamma Microsoft tra cui quelli del mitico Paolo Pialorsi a cui avevo partecipato ma che sicuramente riguarderò nei prossimi giorni.
Ogni tanto mi succede che Visual Studio si incricchi nel designer con un errore "The name 'components' is already used by another object." Ho scoperto finalmente come risolvero: in pratica VS scrive due volte l'instanza di "components". Quindi ... andare nel file "xxx.Designer.cs" ed eliminare una riga come mostrato sotto.
Sto pian pianino imparando ad usare Expression Blend e a forza di tutorial qualcosa di carino viene fuori. Questo è un video riflesso ottenuto seguendo uno dei tutorial presenti qui. Ho scoperto un'altra imponente serie di video-tutorial a questo indirizzo. Tra il libro di Petzold, Blend e video tutorials, sto WPF mi inizia ad acchiappare di brutto.... (sarà per distrarsi dai soliti gestionali grigi-grigi, sarà un pò della mancanza del buon vecchio html? ...mah!)
Come scritto in questo post Microsoft ha reso disponibile una soluzione composta da 3 progetti (GetLocalTime, SetLocalClock, RunElevatedCommand) per dimostrare l'utilizzo del manifest richiesto da Vista per elevare i diritti dei ns eseguibili NET. Ecco il link dove è possibile scaricare i sorgenti. Mi segno per ricordarmi i passi: 1: IL Manifest (nominato mioeseguibile.exe.manifest): 2: <?xml version="1.0" encoding="utf-8" standalone="yes"?> 3: <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 4: <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 5: <security> 6: ...
Codice per lanciare la gestione di IIS: Da riga di comando: %systemroot%\system32\inetsrv\iis.msc Da C#: string sdir = Environment.GetFolderPath(Environment.SpecialFolder.System);sdir = Path.Combine(sdir, "inetsrv\\iis.msc");Process.Start(sdir);
Ho appena scaricato e sto provando Expression Blend. Il grafico che è in me cmq si trova un po spaesato... ecco qui allora una serie di video tutorial che mi hanno permesso di realizzare qualcosina. Ecco il link. Vi segnalo anche altri link interessanti: Glass buttons Tutorial gallery Free video
Oggi mi sono imbattuto in un bachetto di Visual Studio 2005. Se anche a voi capita il warning MSB3061: Unable to delete file ... seguite le istruzioni che riporto sotto: Chiudete Visual Studio Aggiungere questa istruzione nel sorgente del progetto (*.csproj per il c#) nel primo nodo <PropertyGroup>:<GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies> Riaprite e compilate Se avete più progetti includete l'istruzione in tutti i progetti. Questo il post che ha risolto il mio problema.
Mi segno questo codice per ricordarmi le operazioni da effettuare per fare in modo che un mio eseguibile richieda di elevare i privilegi.Creare un file manifest chiamandolo "[Nome].exe.manifest" e salvarlo UTF-8: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="[Nome]" type="win32"/><trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"><security><requestedPrivileges><requestedExecutionLevel level="requireAdministrator"/> </requestedPrivileges></security></trustInfo></assembly> Comando da lanciare (nell'SDK di VS2005):mt.exe -manifest "[Nome].exe.manifest" -outputresource:"[Nome].exe"#1 Maggiori (e migliori) informazioni a questo indirizzo.
Mi avvalgo sempre più spesso dell'utility ILMerge per "unire" exe e dll esterne dei miei progettini di esempio, così da non dover passare a colleghi o amici cartelle contenente i vari pezzettini dell'applicativo. IlMerge è un tool a riga di comando, ma ovviamente c'è qualche buon anima che ci ha sviluppato sopra un'interfaccia grafica. Ne usavo una in particolare, poi su CodeProject è apparso Gilma, che è davvero comodo: interfaccia semplice da usare possibilità di memorizzare delle configurazioni possibilità di firmare l'output Mergiate gente, mergiate....
Controlli iniziano ad essercene sempre più. Ho appena scovato questo per creare i Ribbon.
In questi giorni volevo provare Ajax ma tutte le volte che lo installavo mi sparivano i template dei progetti di Visual Studio...Qualche giorno fa avevo trovato una soluzione poco bella che funzionava ma che cmq non risolveva il problema nel caso reinstallassi Ajax e altre estensioni.Dopo aver letto questo post ho provato e capito che l'errore è dovuto al fatto che il setup non copia nel path giusto gli zip dei templates. Ecco come ho risolto: chiudere istanze aperte di Visual Studio 2005 andare nella directory:%ProgramFiles%\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplatesCache e spostare tutti gli zip che si trovano al di...
Mi è già successo 2 volte nel giro di qualche giorno... apro visual studio 2005 e non vedo più i templates dei progetti. Leggendo un po sui newsgroups ne sono venuto a capo in questo modo: disinstallare le extensions del WCF e WPF e Ajax da VSNET 2005 command prompt lanciare il comando "devenv /installvstemplates"
Interessante libreria FREE che consente di usare i servizi Messenger nelle applicazioni .NET E' un po datata, ma funziona alla grande. Download ed esempi a questo indirizzo.
Piccolo tip preso da esempio su GotDotNet su come indicare nr. di riga e colonna in una RichTextBox Window Form: private void richbox_SelectionChanged(object sender, EventArgs e){Point punto = new Point();punto.X = richbox.GetLineFromCharIndex(richbox.SelectionStart);punto.Y = richbox.SelectionStart - richbox.GetFirstCharIndexFromLine(punto.X);lblStatus.Text = String.Format("Linea: {0} - Colonna: {1}", punto.X.ToString(), punto.Y.ToString());}
Ho appena trovato questo interessante articolo per me profano che non sapevo come fare: ovvero controllare e registrare una propria estensione di file da associare al nostro applicativo windows form.
Trovate l'articolo qui con esempio di codice in c#.
Legato a questo anche un articolo su come estendere il menu contestuale (tasto destro in esplora risorse).
Dopo avere provato, mi rimane da capire come dire a Windows "sentire" le modifiche per fare apparire l'icona che ho associato alla mia nuova estensione senza dover riavviare il pc...
Sulla scia dell'entusiasmo di Igor ho scaricato XNA game studio.Attenzione che se non avete Visual C# EXPRESS installato non va (ho dovuto installarlo sopra VS2005, cmq senza problema). Lanciato C# express ho visto con piacere che c'è incluso un gioco da poter analizzare, funzionante anche se non sono ancora riuscito a comandarlo (per vederlo ho messo delle condizioni vere all'avvio per simulare la pressione del tasto di avvio hehehe.....) Che dire sono affascinato anch'io da questa nuova opportunità che ci da mamma Microsoft... il problema come al solito è il tempo.