Login Register
lunedì 6 settembre 2010
 
Forums
I Forum di WPF Tips & Tricks
Proprietà ImageSource: è possibile usarla in modo relativo?
Last Post 26 lug 2010 10:15 by Gianni Giaccaglini. 5 Replies.
Printer Friendly
Sort:
PrevPrev NextNext
You are not authorized to post a reply.
Author Messages
Gianni Giaccaglini
Basic Member
Basic Member
Posts:42
Avatar

--
24 giu 2010 05:04  
Attualmente riesco a gestire immagini da inserire in un controllo con la proprietà ImageSource seguita dal suo pathname completo.
Esempio:
<TextBlock Name="txtBlock1" Margin="43.833,10,45.371,10" MouseEnter="SuEnter">
<TextBlock.Background>
<ImageBrush Stretch="UniformToFill" ImageSource="C:\MiaBellaFigura.tif" />
</TextBlock.Background>
</TextBlock>

Finora ciò mi basta e avanza per proseguire nello studio, inoltre purtroppo anche gli esempi che trovo in giro usano SEMPRE riferimenti ASSOLUTI per l'origine di ImageSource.
Ma possibile che non ci sia modo di riferirsi a un'immagine in modo RELATIVO, in guisa tale che venga incorporata nella cartella finale Release, potendo così distribuirla, almeno nel caso ClickOnce senza particolari procedure di installazione che caricano la MiaBellaFigura.tif dove previsto in sede di progetto?
E come si fa, se possibile, a utilizzare a tal fine la cartella Resource, ove è facile inserire le immagini desiderate con Aggiungi Risorsa > Aggiungi file esistente... ecc. Le miniature di tali immagini sono ben visibili in Esplora soluzioni. Ma poi COME utilizzarne una nel modo testé indicato?
Vari miei tentativi, su cui sorvolo, non hanno dato esito.

Grazie anticipate a chi indica la soluzione, SE ESISTE.

GIANNI GIACCAGLINI
giannigiac@tin.it
Roberto Sarati
Basic Member
Basic Member
Posts:36
Avatar

--
24 giu 2010 10:13  
prova a leggerti questo:
http://nerddawg.blogspot.com/2005/1...ation.html

Cmq mi pare (purtroppo non posso provarlo ora) che le metti il file nel progetto e lo imposti come risorsa (o anche content) allora puoi riferirti con un url relativo. Tuttavia ripeto che non sono sicuro, dovrei testarlo.
Gianni Giaccaglini
Basic Member
Basic Member
Posts:42
Avatar

--
25 giu 2010 01:39  
AUTOREPLICA
Ringrazio l'amico Roberto. Sto per andare in vacanza (breve), per cui esaminerò a mia volta il suggerimento.

Nel frattempo mi sono detto che l'obiettivo potrebbe essere raggiunto affidando alla routine Initialize l'agognato caricamento dinamico, modificando la proprietà ImageSource. Di qui mi è nato lo spunto più generale, ossia compiere tale modifica in vari contesti, ad esempio per eseguire uno slide showd'immagini in quel TextBlock di nome txtBlock1.
Apriti cielo! Forse ingenuamente, ho pensato che esista una gerarchia di oggetti dal babbo txtBlock1 verso il figlio Backbground e il figlio di questo ImageSource. Purtroppo WPF non presenta la lineare sintassi .NET perché è caratterizzato dalle (dannate) dependancy property, cui si accede in modo distinto con GetValue in lettura e SetValue in scrittura, per giunta con nomi di proprietà e.g. BackgroundProperty per la BackGround diciamo così canonica. Già ma COME ACCEDERE A SOTTO-PROPRIETA', come l'ipotetica ImageSourceProperty?

Ecco un tentativo riuscito, al primo livello:
txtBlock1.SetValue(BackgroundProperty, Nothing)
istruzione che non fa un bel nulla di nulla, ma almeno viene accettata.
Per poter trattare una fantomatica ImageSourceProperty(*) ho fatto diversi tentativi, tutti FALLITI a project time. Ne cito solo due:

txtBlock1.Background.GetValue(ImageBrush.Setvalue(ImageSourceProperty, "")
txtBlock1.Background.Imagebrush.GetValue(ImageSourceProperty, "")

Queste e altre consimili frustrazioni fanno nascere la tentazione di criticare il pur fantastico ma troppo complesso mondo WPF? Non credo, ma una cosa è certa: C'E' MOLTO, MA MOLTO DA STUDIARE!

(*) Che non sono riuscito a far "sputare" dall'intellisense VB ai vari livelli testati, mentre F1 sulla voce ImageSource parla di cose come ImageBrush.ImageSource della libreria System.Windows.Media citando solo incidentalmente XAML. Per la cronaca System.Windows.Media è di regola impostata nelle applicationi WPF. Mah, doppio mah, triplo mah...
Giannigiac@tin.it
Roberto Sarati
Basic Member
Basic Member
Posts:36
Avatar

--
27 giu 2010 09:40  
1) confermo quello che ho detto. Ho inserito un immagine direttamente nel progetto e resco a caricarla come segue (mettendo l'immagine in una cartella Images)
<TextBlock.Background> <ImageBrush ImageSource="Images/mia_immagine.jpg" /> </TextBlock.Background>
- se metto l'immagine come "Resource" allora non ci sono problemi
- se metto l'immagine come "Content" è necessario che ci sia l'immagine anche in output (da qui l'impostazione "copy if newer").

2) per quanto riguarda le Dependency Property ti dò ragione su un punto: sono abbastanza ostiche e c'è moltissimo da studiare! Però posso assicurarti che wpf, anche per queste ultime, è fantastico. Per quello che dici tu:

a) Background non è (e non potrà mai essere) figlio di ImageSource. Semplicemente perchè sono due cose completametne diverse.
La proprietà Background accetta una classe che deriva da Brush (classe astratta). Tra le specializzazioni troviamo:
- SolidColorBrush => colore a tinta unita [es. Brushes.Red]
- GradientBrush => gradiente
- TileBrush che ha a sua volta come specializzazione ImageBrush

Quindi: Per impostare il background da codice basta fare questo:
ImageBrush image = new ImageBrush(new BitmapImage(new System.Uri("pack://application:,,,/Images/mia_immagine.jpg")));
txtBlock1.Background = image;

PS: ricordati che usare "SetValue" e "GetValue" potrebbero portare ad errori (dato che accettano DependencyProperty qualsiasi), quindi imho sono da usare il meno possibile [non dico che sono inutili, anzi, con FrameworkElementFactory e altre cose sono indispensabili]. Però usa le proprietà/metodi associate. Per esempio se sei sicuro che il background di una controllo sia un ImageBrush, allora basta fare il casting:
(txtBlock1.Background as ImageBrush).ImageSource = null;
Se vai a vedere con reflector la proprietà ImageSource di ImageBrush fa esattamente la SetValue:
public ImageSource ImageSource
{
get
{
return (ImageSource) base.GetValue(ImageSourceProperty);
}
set
{
base.SetValueInternal(ImageSourceProperty, value);
}
}

Non affliggerti. Studia e applica. Poi ti si aprirà un mondo fantastico!
Gianni Giaccaglini
Basic Member
Basic Member
Posts:42
Avatar

--
12 lug 2010 11:28  
Grazie infinite e complimenti... reciproci (hai notato? 5 diconsi 5 stelle di gradimento per la ns. chiacchierate!). Infatti la tua competenza mi pare che abbia brillato a causa dei basilari dubbi posti da me. A mio modesto avviso - parlo come un "mezzo" principiante, che - giuro! - conosce abbastanzsa le notevoli proprietà multimedia ecc. di Wpf mentre è sugli aspetti STRUTTURALI che la docum. in giro è carente (non parliamo dell'Intellisense, secondo me penoso...): ho un manuale di mille e passa pagg. ma non vi è trfaccia dei segreti di chi "la sa lunga" come te.
Al volo osservo che i problemi nascono proprio dalla basilare innovazione XAML che ha creato difformità (E CONFUSIONE) col classimo modello a oggetti .NET.

Concludo invitandoti caldamente a scrivere un articolo SISTEMATICO su queste tematiche (*). Farai contento il ns. illustre Webmaster (che non a torto mi bacchetta per la mian invadenza nel Forum, invitandomin a fare articoli piuttosto che lunghi post) e, soprattuto, i visitatori alle prime e seconde armi con WPF. Dopo di che la strada, per tutti sarà in discesa.
Ciao
Gianni
Giannigiac@tin.it

(*) Altro tema che forse tratterò io con qualche sistematicità: come combinare opportunamente i vari contenitori Grid, StackPanel e compagnia bella... Un altro piccolo pastic(cetto) o (ciaccio?)
Gianni Giaccaglini
Basic Member
Basic Member
Posts:42
Avatar

--
26 lug 2010 10:15  
UN ULTERIORE RIPENSAMENTO...
Ho dato per buoni i suggerimenti, avendoli esaminati "in linea teorica". Ultimamente ho tentato di mettere in pratica il PRIMO, ossia:
"se metto un'immagine direttamente nel progetto resco a caricarla come segue (mettendo l'immagine in una cartella Images)
<TextBlock.Background> <ImageBrush ImageSource="Images/mia_immagine.jpg" /> </TextBlock.Background>"

Purtroppo ho creato la fantomatica cartella Images contenente la mia_immagine.jpg in tutti i possibili ambiti di quel certo progetto C:\...\Visual Studio 2010\Projects\MiaWpfApplication, in primis nelle suttocartelle bin\debug e bin\release. NIENTE DA FARE, rigetto sistematico. A meno di aver trascurato qualche subdir (cosa improbabile, direi) o di una particolare, segreta collacazione della fantomatica cartella Images - nel qual caso MI SI DICA DOVE, santo cielo... - i problemi non si pongono con dei pathname completi anche di DRIVE, come il banale C:\mia_immagine.jpg. L'immagine appare subito nel pannello Progettazione. Così ne deduco che in Wpf NON C'E' ALTRO DA FARE e prenderne atto senza farsi illusioni.
Saluti
Gianni

You are not authorized to post a reply.

Active Forums 4.2
  
 
© 2009-2010 WPF Tips&Tricks Team - Visual Basic Tips&Tricks Network