Errore a Design Time - Finestra di progettazione

di il
6 risposte

Errore a Design Time - Finestra di progettazione

Vorrei capire perchè:

Se scrivo il mio controllo utente in questo modo definendo una proprietà di classe di tipo Image, la finestra di Progettazione del parent dell'oggetto funziona e si apre correttamente

public partial class Finestra : UserControl
    {
        public static Image imSpeaker { get; set; }
        ....
	private void Finestra_Paint(object sender, PaintEventArgs e)
        {
        	if (_Rumore) e.Graphics.DrawImageUnscaled(imSpeaker, 2*SpessTap, Height / 2 - 13);
        	...
       	}
    }
che nel parent inizializzo così:

// Setta immagine file altoparlante nella classe Finestra
Image imAlt = Image.FromFile("Altoparlante30.png");
Finestra.imSpeaker = imAlt;
Se invece la scrivo così:

public partial class Finestra : UserControl
    {
        private static Image imSpeaker = Image.FromFile("Altoparlante30.png");   //<<<<< in questa riga da errore ma solo a design time
        ....

        private void Finestra_Paint(object sender, PaintEventArgs e)
        {
        	if (_Rumore) e.Graphics.DrawImageUnscaled(imSpeaker, 2*SpessTap, Height / 2 - 13);
        	...
       	}
    }
la finestra di Progettazione del parent non si apre e mostra errori alla riga indicata.

Premetto che in entrambi i casi la compilazione va a buon fine e il progetto funziona regolarmente.
E' solo Visual Studio che non mi fa vedere la finestra a Design Time.
Perchè ....

Un saluto a tutta la comunità

6 Risposte

  • Re: Errore a Design Time - Finestra di progettazione

    Per il momento ho scoperto che se metto tutto il path del file allora funziona anche la finestra di Progettazione.
    Quindi in run time il file "Altoparlante30.png" viene cercato nella directory del programma mentre in Design time visual studio lo cerca altrove e non lo trova.

    Così la finestra di Progettazione funziona ma il programma non è portabile
    
    public partial class Finestra : UserControl
        {
            private static Image imSpeaker = Image.FromFile(@"D:\Andrea\C_Sharp\Portale RIF\Portale RIF\bin\Debug\Altoparlante30.png"); 
            ....
    
            private void Finestra_Paint(object sender, PaintEventArgs e)
            {
            	if (_Rumore) e.Graphics.DrawImageUnscaled(imSpeaker, 2*SpessTap, Height / 2 - 13);
            	...
           	}
        }
        
  • Re: Errore a Design Time - Finestra di progettazione

    Dunque se metto una copia del file anche nella directory del file soluzione (*.sln) allora funziona sia in design time che in run time. Un po' troppo macchinoso .....
  • Re: Errore a Design Time - Finestra di progettazione

    zorban62 ha scritto:


    Dunque se metto una copia del file anche nella directory del file soluzione (*.sln) allora funziona sia in design time che in run time. Un po' troppo macchinoso .....
    Visto che carichi l'immagine da un file esterno, perché vuoi caricarla proprio contestualmente alla sua dichiarazione e non quando il controllo viene inizializzato?

    Se vuoi vederla anche in fase di progettazione, meglio inserirla nel progetto come risorsa invece di forzare il caricamento dell'immagine: basta uno spostamento involontario del file per impedirne il caricamento che, eseguito al momento dell'inizializzazione del controllo, può anche impedirne la progettazione (giustamente).
  • Re: Errore a Design Time - Finestra di progettazione

    Grazie Marco, alla fine sono giunto anch'io a questa conclusione solo che non so come si fa ad aggiungere un'immagine come risorsa. In questo caso se ho ben capito l'immagine sarebbe inserita direttamente nell'eseguibile e non ci sarebbe la necessità di allegare il file immagine al file eseguibile.

    L'unica cosa che mi viene in mente è utilizzare una picturebox dove carico un file *.png con il canale alpha della trasparenza.
    Però non so se posso controllare la visibilità della pictureBox dall'evento Paint del mio controllo utente.
    Farò delle prove ....

    Altrimenti vi chiedo se esiste un modo da codice o da visual studio per caricare un file immagine come risorsa e utilizzarla poi con il metodo DrawImageUnscaled(Image image, int x, int y);?

    Saluti

    Andrea
  • Re: Errore a Design Time - Finestra di progettazione

    Https://www.c-sharpcorner.com/UploadFile/a8fb12/accessing-image-files-from-project-resources/
  • Re: Errore a Design Time - Finestra di progettazione

    Grazie ai vostri consigli sono riuscito nell'intento ...
    Dopo aver caricato l'immagine Altoparlante30.png con Alpha channel nelle risorse del progetto come indicato da gian82 ho modificato il codice come segue e funziona alla grande ...
    
    using Portale_RIF.Properties;
    ...
    private void Finestra_Paint(object sender, PaintEventArgs e)
    {
    	.....
    	if (_Rumore) e.Graphics.DrawImageUnscaled(Resources.Altoparlante30, Width / 2 - 15, Height - 2*SpessTap - 26);
    }
    
    Che differenza c'è fra caricare una "risorsa locale" o "risorsa del progetto"?
    Nella finestra di caricamento della risorsa posso scegliere fra questi due "contesti di risorsa" qual'è il loro scopo?
    Ho visto che praticamente vengono inseriti in file *.resx diversi: nel primo caso quello della classe (risorsa locale) nel secondo nel file Resources.resx del progetto.

    Grazie a tutti e Auguri di Buon Anno
Devi accedere o registrarti per scrivere nel forum
6 risposte