2010-11-24 37 views
2

画像を動的に変更する問題があります。WPFを使用してC#で画像を動的に変更

背景情報: 私は選択可能な要素を含むリストボックスを持っています。これらの項目は食品のカテゴリです。 ユーザーが食品の1つをクリックすると、ページの別の場所の画像を変更したいと思います。

私のXAMLファイルが含まれています。私は、画像m_mainImageという変数を持っている私の食糧クラスで

FoodCollection foods = (FoodCollection)this.FindResource("FoodCategory"); 
      Food f = foods[foodListBox.SelectedIndex]; 
      Title_TextBlock.Text = f.Name; 
      bigImage = f.MainImage; 

<Image Name="bigImage" Stretch="Fill" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"/> 

をユーザが「bigImage」は変化するであろうことを確信食品カテゴリをクリックしたとき:

public class Food 
    { 
     ... 

     Image m_mainImage = new Image(); 
     String m_mainImagePath = string.Empty; 

     ... 

     public string MainImagePath{ 
      get { return m_mainImagePath; } 
      set 
      { 
       m_mainImagePath = value; 
       m_mainImage.BeginInit(); 
       m_mainImage.Source = new BitmapImage(new Uri(m_mainImagePath, UriKind.RelativeOrAbsolute)); 
       m_mainImage.EndInit(); 
       RaisePropertyChanged("MainImage"); 
       RaisePropertyChanged("MainImagePath"); 
      } 
     } 

     public Image MainImage 
     { 
      get { return m_mainImage; } 
     } 


     public event PropertyChangedEventHandler PropertyChanged; 
     protected void RaisePropertyChanged(string name) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 

    } 
} 

私は画像を「解決」しなければならなかったが、私はunclだったそれが意味するものの耳。 は、私は、これはそれを行うだろうと思った:

m_mainImage.BeginInit(); 
        m_mainImage.Source = new BitmapImage(new Uri(m_mainImagePath, UriKind.RelativeOrAbsolute)); 
        m_mainImage.EndInit(); 

申し訳ありませんが、私はまだWPFとC#に新しいです。 ありがとうございます。

答えて

0

あなたは、ウィンドウのDataContext設定されていますか?このPropertyChangedなし

ので、初期化されません。

if (PropertyChanged != null) 
    PropertyChanged(this, new PropertyChangedEventArgs(name)); 

PropertyChangedとして発動することはありません常にnullです。

+0

ああ、私はどのようにDataContextを設定するのですか? –

+0

@Aero - もっとも簡単なのは 'this.DataContext = this;'がコンストラクタの最高レベルで設定されることですが、より具体的にすることができます。 – ChrisF

0

セットアップいくつかの双方向バインディング:

試してみてください。

bigImage.SetBinding(Image.SourceProperty, new Binding(){ 
     Source = f, 
     Path = new PropertyPath("MainImage"), 
     Mode=BindingMode.TwoWay 
    }); 

または:

<Image Name="bigImage" 
     Stretch="Fill" 
     Grid.Row="0" 
     Grid.Column="0" 
     HorizontalAlignment="Center" 
     VerticalAlignment="Center" 
     Source="{Binding Path=MyBitmapImage, Mode=TwoWay}"/> 

public BitmapImage MyBitmapImage 
{ 
    get 
    { 
     return new BitmapImage(new Uri(m_mainImagePath, UriKind.RelativeOrAbsolute)); 
    } 
} 
+0

それはコンパイルず、実行されます。最初のメソッドを試しましたが、画像が表示されないようです:o –

+0

'MainImage'の値を' BitmapImage'に、ゲッターを 'return m_mainImage.Source'に変更してください。 – Gabe

0

これが役立つかどうかわからないが、MainImagePath用セッターでm_mainImage.EndInit()の呼び出しはRaisePropertyChanged("MainImage")のための呼び出しの後に発生してはならない...

アンドリュー

関連する問題