使用WPF在C#中动态更改图像

时间:2010-11-24 20:10:28

标签: c# wpf image

我遇到动态更改图片的问题。

一些背景信息: 我有一个列表框,其中包含可以选择的元素。这些物品是食品类别。 当用户点击其中一种食物时,我希望页面的不同位置的图像能够改变。

我的Xaml文件包含:

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

因此,当用户点击某个食物类别时,“bigImage”会改变:

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

在我的食物类中,我有一个名为Image m_mainImage的变量:

    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));
        }

    }
}

我在某处读到了我必须“解决”图像,但我不清楚这是什么意思。 我以为会这样做:

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

抱歉,我还是WPF和C#的新手。 提前谢谢。

3 个答案:

答案 0 :(得分:0)

设置一些TwoWay绑定:

尝试:

 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));
   }
}

答案 1 :(得分:0)

您是否设置了窗口的DataContext

如果没有这个PropertyChanged将不会被初始化,所以:

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

永远不会触发,因为PropertyChanged总是null

答案 2 :(得分:0)

不确定这是否有帮助,但在调用m_mainImage.EndInit()之后,MainImagePath的设置器中不应调用RaisePropertyChanged("MainImage") ...

安德鲁