如何在XAML中重新加载图像?

时间:2018-08-17 10:54:12

标签: c# image xaml uwp

我正在编写UWP。在此应用程序的界面中,按钮下方有一个图像,并且一个ObservableCollection绑定到图像集合。

<Image VerticalAlignment="Center"
    HorizontalAlignment="Center" Stretch="Fill"
    x:Name="FlatWallpaperUI"/>

但是,当选择某种强调色时,这些图像会被处理并且颜色会改变。 例如,启动应用程序时,图像会加载正确的颜色:

The Image with the colors applied to it at the launce of the app

我试图通过重置ObservableCollection或将Bitmapimage重新分配给XAML中的图像来重新加载这些图像。 例如,我将bitmapimage重新分配给按钮下的图像:

ButtonImage.Source = new BitmapImage(new Uri("ms-appx:///Assets/wallpaper2.png"));

对于ObservableCollection,我尝试将其清空,然后阅读以下项目:

Items.Clear();
Items.Add(new ItemClass
  {
    Name = "First item",
    Image = new BitmapImage(new Uri("ms-appx:///Assets/wallpaper1.png"))
  });
Items.Add(new ItemClass
  {
    Name = "Second item",
    Image = new BitmapImage(new Uri("ms-appx:///Assets/wallpaper2.png"))
  });

我知道这可能是错误的方法,但到目前为止我一直在研究尚无明确的解决方案。

在此图像上,您看到颜色已更改,但图像本身没有改变!

This is the Image after I change the color

即使应该处理的图像本身已成功更改!

Even though the Image itself has been changed!

如何解决这个问题并在应有的时候更新映像?

1 个答案:

答案 0 :(得分:1)

首先:我同意您可以共享更多代码。这些图片不错,但并不能帮助您解决问题。

第二:我的猜测是,您假设更改ObservableCollection元素的属性会触发更新,但实际情况并非如此。如果我说的对,这是一个可能的解决方案,如果我的猜测很糟糕,请编辑您的问题并澄清:

您可以像这样创建自己的ObservableCollection并听取某些元素的修改:

Settings

然后在您的代码中,您可以像这样收听:

public class ModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged(String PropName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(PropName));
        }
    }

    protected void SetAndRaisePropertyChanged<T>(ref T Prop, T value, [CallerMemberName] String PropName = "")
    {
        Prop = value;
        RaisePropertyChanged(PropName);
    }
}

public class CustomCollection<T> : ObservableCollection<T> where T : ModelBase
{
    public event PropertyChangedEventHandler ChildrenPropertyChanged;
    protected override void ClearItems()
    {
        base.ClearItems();

        foreach (var item in this)
        {
            DisposeItem(item);
        }
    }

    protected override void InsertItem(int index, T item)
    {
        base.InsertItem(index, item);
        item.PropertyChanged += Model_PropertyChanged;
    }

    protected override void RemoveItem(int index)
    {
        base.RemoveItem(index);
        DisposeItem(this[index]);
    }

    private void DisposeItem(ModelBase model)
    {
        model.PropertyChanged -= Model_PropertyChanged;
    }

    private void Model_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        ChildrenPropertyChanged.Invoke(sender, e);
    }
}

[...]

private CustomCollection<ItemClass> m_Items = new CustomCollection<ItemClass>();
public CustomCollection<ItemClass> Items
{
    get { return m_Items; }
    set => SetAndRaisePropertyChanged(ref m_Items, value);
}

[...]

Items.ChildrenPropertyChanged += Items_ChildrenPropertyChanged;