我正在编写UWP。在此应用程序的界面中,按钮下方有一个图像,并且一个ObservableCollection绑定到图像集合。
<Image VerticalAlignment="Center"
HorizontalAlignment="Center" Stretch="Fill"
x:Name="FlatWallpaperUI"/>
但是,当选择某种强调色时,这些图像会被处理并且颜色会改变。 例如,启动应用程序时,图像会加载正确的颜色:
我试图通过重置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"))
});
我知道这可能是错误的方法,但到目前为止我一直在研究尚无明确的解决方案。
在此图像上,您看到颜色已更改,但图像本身没有改变!
即使应该处理的图像本身已成功更改!
如何解决这个问题并在应有的时候更新映像?
答案 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;