2010-09-27 4 views
3

J'ai un contrôle d'image sur une fenêtre dans mon projet WPFPourquoi l'événement SourceUpdated ne déclenche-t-il pas mon contrôle d'image dans WPF?

XAML:

<Image 
    Source="{Binding NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}" 
    Binding.SourceUpdated="bgMovie_SourceUpdated" 
    Binding.TargetUpdated="bgMovie_TargetUpdated" /> 

Dans le code, je suis en train de changer la source de l'image

C#:

myImage = new BitmapImage(); 
myImage.BeginInit(); 
myImage.UriSource = new Uri(path); 
myImage.EndInit(); 
this.bgMovie.Source = myImage; 

Mais l'événement bgMovie_SourceUpdated n'est jamais déclenché. Est-ce que quelqu'un peut faire la lumière sur ce que je fais mal?

+3

protip: Couper le non-sens et adapter tout à l'écran pour augmenter la probabilité d'une personne de répondre à votre question! – Will

Répondre

6

En assiging une valeur directement à la propriété Source, vous êtes "déliaison" ... Votre Image contrôle ne DataBound plus, il a juste une valeur locale.

Dans 4.0, vous pouvez utiliser la méthode SetCurrentValue:

this.bgMovie.SetCurrentValue(Image.SourceProperty, myImage); 

Malheureusement, cette méthode n'est pas disponible en 3.5, et il n'y a pas d'alternative facile ...

Quoi qu'il en soit, qu'est-ce que vous essayez de faire exactement? Quel est le point de liaison de la propriété Source si vous le définissez manuellement de toute façon? Si vous voulez détecter les changements de propriété Source, vous pouvez utiliser la méthode DependencyPropertyDescriptor.AddValueChanged:

var prop = DependencyPropertyDescriptor.FromProperty(Image.SourceProperty, typeof(Image)); 
prop.AddValueChanged(this.bgMovie, SourceChangedHandler); 
... 

void SourceChangedHandler(object sender, EventArgs e) 
{ 

} 
+0

SetCurrentValue - nice - Je n'étais pas au courant de cela dans ma campagne recrue en 4.0 ... –

+0

Donc, j'ai mis à jour mon projet à 4.0 hier soir et utilisé SetCurrentValue, mais il ne déclenchera toujours pas l'événement SourceUpdated. J'ai supprimé tout le code de liaison dans le fichier XAML et a pointé l'événement SourceUpdated du contrôle à la fonction correcte. Est-ce qu'il me manque encore quelque chose? –

+0

Le mot "Source" dans l'événement SourceUpdated n'a rien à voir avec la source de l'image, il fait référence à la source de la liaison. SourceUpdated sera déclenché si le contrôle met à jour la source de la liaison, ce qui n'arrivera jamais avec votre code. Mais l'événement TargetUpdated devrait être déclenché ... –

2

En codant en dur la Source dans le code, vous rompez la liaison dans votre XAML. Au lieu de cela, associez-vous à une propriété que vous définissez en utilisant (le plus souvent) le même code que ci-dessus. Voici une façon de le faire.

XAML:

<Image Name="bgMovie" 
     Source="{Binding MovieImageSource, 
         NotifyOnSourceUpdated=True, 
         NotifyOnTargetUpdated=True}" 
     Binding.SourceUpdated="bgMovie_SourceUpdated" 
     Binding.TargetUpdated="bgMovie_TargetUpdated" /> 

C#:

public ImageSource MovieImageSource 
    { 
     get { return mMovieImageSource; } 
     // Set property sets the property and implements INotifyPropertyChanged 
     set { SetProperty("MovieImageSource", ref mMovieImageSource, value); } 
    } 

    void SetMovieSource(string path) 
    { 
     myImage = new BitmapImage(); 
     myImage.BeginInit(); 
     myImage.UriSource = new Uri(path); 
     myImage.EndInit(); 
     this.MovieImageSource = myImage; 
    } 
Questions connexes