2013-08-31 17 views
10

Uso binding per l'origine di un controllo Image.Come impostare una fonte predefinita per un'immagine se l'origine di associazione è nullo?

<Image Source="{Binding ImageUri}"/> 

Ma questo ImageUri può essere nullo, Perciò voglio utilizzare un'immagine predefinita, un posto da titolare, per questo, che può essere in /Assets/PlaceHolder.png per esempio.

Come si imposta un'immagine predefinita? Grazie. (si tratta di un'applicazione WP8, ma non dovrebbe essere diverso di WPF)

risposta

16

È possibile ottenere impostando TargetNullValue

<Image> 
    <Image.Source> 
     <Binding Path="ImageUri" > 
      <Binding.TargetNullValue> 
       <ImageSource>/Assets/PlaceHolder.png</ImageSource> 
      </Binding.TargetNullValue> 
     </Binding> 
    </Image.Source> 
</Image> 
+1

Ho un'applicazione in cui carica centinaia di immagini. Come mostrare un'immagine predefinita finché non viene caricata l'immagine reale? –

+0

@ArjunKR si consiglia di visitare http://stackoverflow.com/questions/19113141/is-it-possible-to-show-default-image-before-original-load-from-server –

1

È possibile utilizzare ImageFailed evento e ChangePropertyAction.

Questo frammento di codice ha funzionato per me:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 

<Image x:Name="GeologyMapsLegend" Stretch="Fill" Height="150"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="ImageFailed"> 
      <ei:ChangePropertyAction PropertyName="Source" TargetName="GeologyMapsLegend"> 
       <ei:ChangePropertyAction.Value> 
        <ImageSource> 
         /LanSysWebGIS;component/Pictures/Icon/NoImageAvailable.jpg 
        </ImageSource> 
       </ei:ChangePropertyAction.Value> 
      </ei:ChangePropertyAction> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Image> 
+0

Ho un'applicazione in cui carica centinaia di immagini. Come mostrare un'immagine predefinita finché non viene caricata l'immagine reale? –

3

È possibile impostare l'evento ImageFailed sulla vostra immagine,

<Image Source="{Binding ImageUri}" ImageFailed="Image_ImageFailed"/> 

e utilizzare il seguente C# per caricare un'immagine specifica al suo posto.

private void Image_ImageFailed(object sender, ExceptionRoutedEventArgs e) 
{ 
    ((Image)sender).Source = new BitmapImage(new Uri("/Assets/MyDefaultImage.png", UriKind.Relative)); 
} 
2

Si può effettivamente andare nella direzione opposta attorno al quale è un'esperienza migliore a mio parere, semplicemente utilizzando due Image controlli in un layout Grid, uno con la fonte segnaposto locale e uno con il telecomando Binding. L'immagine locale è già presente quando l'associazione remota è nullo. Tuttavia, se l'associazione non è nulla, copre automaticamente l'immagine del segnaposto locale una volta che viene eseguito il rendering.

<Grid> 
    <Image Source="Assets/Placeholder.png"/> 
    <Image Source="{Binding ImageUri}"/> 
</Grid> 
+0

Questo funziona in teoria ma le mie immagini hanno sfondi trasparenti. Ciò significa che posso vedere l'immagine sotto la mia altra immagine. Come posso nascondere l'immagine sottostante? – Sweepster

+0

@Sweepster Prova a utilizzare l'evento ImageOpened dell'immagine associata. Imposta l'opacità dell'immagine segnaposto su 0 se l'evento di apertura dell'immagine dell'evento associato ai dati viene attivato correttamente !! – Shikhar

0

uso TargetNullValue attributo. È molto utile se non voglio visualizzare alcuna immagine.