WPF-ObservableCollection
WPF - ObservableCollection
我的 CameraWindow
中有一个 ObservableCollection
,我在其中手动从我的 USB 网络摄像头捕获图像。这是我的 collection:
public ObservableCollection<BitmapImage> CameraWindowCapturedImages { get; } = new ObservableCollection<BitmapImage>();
这就是我捕捉图像的方式
void Cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
try
{
System.Drawing.Image img = (Bitmap)eventArgs.Frame.Clone();
MemoryStream ms = new MemoryStream();
img.Save(ms, ImageFormat.Jpeg);
ms.Seek(0, SeekOrigin.Begin);
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = ms;
bi.EndInit();
bi.Freeze();
this.latestFrame = bi;
Dispatcher.BeginInvoke(new ThreadStart(delegate
{
previewWindow.Source = bi;
}));
}
catch (Exception ex)
{
}
}
private void manualCapture_Click(object sender, RoutedEventArgs e)
{
if (captureImage != null)
{
captureImage(latestFrame);
}
Bitmap bm = BitmapImage2Bitmap(latestFrame);
CapturedImages.Add(latestFrame);
}
private Bitmap BitmapImage2Bitmap(BitmapImage bitmapImage)
{
using (MemoryStream outStream = new MemoryStream())
{
BitmapEncoder enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bitmapImage));
enc.Save(outStream);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream);
return new Bitmap(bitmap);
}
}
我的 MainWindow
中也有 ObservableCollection
public ObservableCollection<BitmapImage> MainWindowCapturedImages { get; } = new ObservableCollection<BitmapImage>();
并且我想将我的 CameraWindow
中手动拍摄的图像存储在 MainWindow
的 ObservableCollection
中。
这可能吗?如果可能的话,有人可以帮助我吗?
谢谢!
您需要以某种方式获得对 window 的引用。最简单的方法可能是使用 Application.Current.Windows
集合:
MainWindow mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
if(mainWindow != null)
{
mainWindow.MainWindowCapturedImages.Add(latestFrame);
}
执行此操作的快速方法是(C# 6 和 WPF):
(App.Current.MainWindow as MainWindow)?.Items.Add(image);
另外我不建议这样做。您应该使用 MVVM 模式,这是 WPF 应用程序推荐的开发技术
我的 CameraWindow
中有一个 ObservableCollection
,我在其中手动从我的 USB 网络摄像头捕获图像。这是我的 collection:
public ObservableCollection<BitmapImage> CameraWindowCapturedImages { get; } = new ObservableCollection<BitmapImage>();
这就是我捕捉图像的方式
void Cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
try
{
System.Drawing.Image img = (Bitmap)eventArgs.Frame.Clone();
MemoryStream ms = new MemoryStream();
img.Save(ms, ImageFormat.Jpeg);
ms.Seek(0, SeekOrigin.Begin);
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = ms;
bi.EndInit();
bi.Freeze();
this.latestFrame = bi;
Dispatcher.BeginInvoke(new ThreadStart(delegate
{
previewWindow.Source = bi;
}));
}
catch (Exception ex)
{
}
}
private void manualCapture_Click(object sender, RoutedEventArgs e)
{
if (captureImage != null)
{
captureImage(latestFrame);
}
Bitmap bm = BitmapImage2Bitmap(latestFrame);
CapturedImages.Add(latestFrame);
}
private Bitmap BitmapImage2Bitmap(BitmapImage bitmapImage)
{
using (MemoryStream outStream = new MemoryStream())
{
BitmapEncoder enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bitmapImage));
enc.Save(outStream);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream);
return new Bitmap(bitmap);
}
}
我的 MainWindow
ObservableCollection
public ObservableCollection<BitmapImage> MainWindowCapturedImages { get; } = new ObservableCollection<BitmapImage>();
并且我想将我的 CameraWindow
中手动拍摄的图像存储在 MainWindow
的 ObservableCollection
中。
这可能吗?如果可能的话,有人可以帮助我吗? 谢谢!
您需要以某种方式获得对 window 的引用。最简单的方法可能是使用 Application.Current.Windows
集合:
MainWindow mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
if(mainWindow != null)
{
mainWindow.MainWindowCapturedImages.Add(latestFrame);
}
执行此操作的快速方法是(C# 6 和 WPF):
(App.Current.MainWindow as MainWindow)?.Items.Add(image);
另外我不建议这样做。您应该使用 MVVM 模式,这是 WPF 应用程序推荐的开发技术