控件只显示第一张图片,如果属性更改(并触发事件),控件甚至不会再次尝试获取该值。
如果在窗口初始化时属性为null,则什么也不显示,即使稍后设置了图像也是如此。
该图像大约为2MB位图。
这是XAML代码:
这是主窗口实例化的地方,视图模型作为参数传递,并在构造函数中设置。
这是XAML代码:
<Image
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="2"
Source="{Binding Path=CurrentImg,UpdateSourceTrigger=PropertyChanged, Mode= TwoWay}"/>
以下是视图模型代码:
private BitmapImage _CurrentImg;
public BitmapImage CurrentImg
{
get { return _CurrentImg; }
set
{
_CurrentImg = value;
RaisePropertyChanged("CurrentImg");
}
}
public void ButtonCommandExecute()
{
TestAlgo.Next();
this.CurrentImg = TestAlgo.toWpfBitmapImage();
}
最后,这是从System.Drawing.Bitmap创建BitmapImage的方法。
public BitmapImage toWpfBitmapImage()
{ return convertBitmapToBitmapSource(this.CurBitmap); }
/// <summary>
/// Converts a <see cref="System.Drawing.Bitmap"/> to <see cref="System.Windows.Media.Imaging.BitmapSource"/>
/// </summary>
/// <param name="bitmap">Source</param>
/// <returns>Converted image</returns>
public static BitmapImage convertBitmapToBitmapSource(System.Drawing.Bitmap bitmap)
{
//salvo la bitmap nel MemoryStream, in modo che lo posso usare come sorgente per una nuova BitmapSource
BitmapImage imageToReturn = new BitmapImage();
using (MemoryStream stream = new MemoryStream())
{
bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
//creo la nuova BitmapSource da ritornare
stream.Seek(0, SeekOrigin.Begin);
imageToReturn.BeginInit();
imageToReturn.CacheOption = BitmapCacheOption.OnLoad;
imageToReturn.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
imageToReturn.StreamSource = stream;
imageToReturn.EndInit();
}
return imageToReturn;
}
这是主窗口实例化的地方,视图模型作为参数传递,并在构造函数中设置。
public partial class App : Application
{
MainWindowVM MainWinVM;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
MainWinVM = new MainWindowVM();
MainWindow win = new MainWindow(MainWinVM);
win.Show();
}
protected override void OnExit(ExitEventArgs e)
{
MainWinVM.SaveDb();
base.OnExit(e);
}
}
public partial class MainWindow : Window
{
public MainWindow()
{
this.DataContext = new MainWindowVM();
InitializeComponent();
}
public MainWindow(MainWindowVM vm)
{
DataContext = vm;
InitializeComponent();
}
}
ButtonCommandExecute
执行正常,但图像没有改变?CurrentImg
属性是什么样子的? - dkozlButtonCommandExecute
是否会异步执行,还是所有操作都在 UI 线程上进行? - dkozl