Binding Image.Source from BitmapImage variable using INotify
本文关键字:variable using INotify BitmapImage from Image Source Binding | 更新日期: 2023-09-27 18:34:25
我想将我的 CurrentWallpaper 变量绑定到 Image.Source 并在它发生变化时更新 Image 控件。这是我的代码:
public sealed partial class MainPage : Page, INotifyPropertyChanged
{
public BitmapImage CurrWall = new BitmapImage();
BitmapImage CurrentWallpaper
{
get { return CurrWall; }
set { CurrWall = value; OnPropertyChanged("CurrentWallpaper"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
在页面标签上,我添加了这个 DataContext 属性。
DataContext="{Binding RelativeSource={RelativeSource Self}}"
那是我的图像控件
<Image x:Name="CurrentWallpaperImage" Source="{x:Bind CurrWall}"/>
当我尝试设置新源时,图像控件不会更新。
StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(path);
IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read);
await CurrentWallpaper.SetSourceAsync(stream);
您实际上并没有为页面的 CurrentWallpaper 属性分配新值。因此,不会触发 OnPropertyChanged。
2 个选项,或者您仍然使用 SetSource 方法,但在该行之后自己调用OnPropertyChanged("CurrentWallpaper");
以确保 UI 已更新。
或者使用您拥有的流创建一个新的位图图像,并将该新位图图像完全连接到您的当前壁纸。
CurrentWallpaper = newBitmapImage;
首先,将CurrentWallpaper
声明为public
属性
private BitmapImage currentWall = new BitmapImage();
public BitmapImage CurrentWallpaper
{
get { return currentWall; }
set { currentWall= value; OnPropertyChanged("CurrentWallpaper"); }
}
其次,将Binding
更改为OneWay
<Image x:Name="CurrentWallpaperImage" Source="{x:Bind CurrWall, Mode=OneWay}"/>
如果在第一步或第二步后不起作用,请尝试手动引发事件
await CurrentWallpaper.SetSourceAsync(stream);
OnPropertyChanged("CurrentWallpaper");