wpf - 在 UserControl WPF 内的 PictureBox 上绘制图像

标签 wpf winforms picturebox

我正在尝试在 PictureBox 上绘制图像来 self 用 WindowsFormsHost 插入的相机.代码简单如下:

<Window x:Class="videoTEst.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="583" Width="1132"
    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms">
<StackPanel Background="LightBlue" Height="513" Width="1077">
    <StackPanel HorizontalAlignment="Center" Width="450" Orientation="Horizontal">
        <Button Name="ButtonOpen" Content="Load" Click="ButtonOpen_OnClick" />
        <Button Name="ButtonLoadImage" Content="Load image" Click="ButtonLoadImage_OnClick" />
        </StackPanel>
    <StackPanel Orientation="Horizontal">
        <WindowsFormsHost Name="WinFormsHost" Height="440" Width="690" HorizontalAlignment="Left">
                <wf:PictureBox x:Name="PictureBoxvideo" SizeMode="Normal" Paint="PictureBoxvideo_Paint"></wf:PictureBox>
        </WindowsFormsHost>
        <ListBox Name="ListBoxLog" />
    </StackPanel>
</StackPanel>

然后我像这样用相机作画:

 private void asyncVideoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        Image temp = PictureBoxvideo.Image;
        Bitmap bitmap = eventArgs.Frame;
        PictureBoxvideo.Image = new Bitmap(bitmap);
        if (temp != null) temp.Dispose();
        bitmap.Dispose();
   }

此代码完美运行。

但是当我改变 <Window>标记为 <UserControl> (因为我希望它嵌入我自己的 UserControl ),它不绘画!!

为什么它不在 UserControl 上绘画? ?

为什么我不使用 Image来自 WPF? Image有一个线程使用真的很困惑,每当我尝试在 Image 上绘画时, Bitmap之前被处理掉了。

最佳答案

您可以简单地使用 WPF Image 控件代替 WindowsFormsHost 中的 PictureBox:

<StackPanel Orientation="Horizontal">
    <Image x:Name="image" Height="440" Width="690" HorizontalAlignment="Left"/>
    ...
</StackPanel>

您现在可以使用 this answer 中所示的代码从 Bitmap 对象创建一个 BitmapImage。或在 this answer ,通过额外调用 Freeze 使其可以在 UI 线程中访问:

Bitmap bitmap = eventArgs.Frame; // your NewFrameEventArgs
BitmapImage bitmapImage = new BitmapImage();

using (var stream = new MemoryStream())
{
    bitmap.Save(stream, ImageFormat.Bmp);
    stream.Seek(0, SeekOrigin.Begin);

    bitmapImage.BeginInit();
    bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
    bitmapImage.StreamSource = stream;
    bitmapImage.EndInit();
}

bitmapImage.Freeze();

最后,您将通过调用 Dispatcher 来更新 UI 线程中的 Image 控件:

image.Dispatcher.Invoke((Action)(() => image.Source = bitmapImage));

关于wpf - 在 UserControl WPF 内的 PictureBox 上绘制图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18127519/

相关文章:

c# - 快速流畅地滚动图像

c# - Winforms 绑定(bind)源问题添加新记录

c# - 在 WinForm 应用程序中进行批处理时,如何让 UI 线程更新 UI?

c# - 阻止 PictureBox 接收事件 C#

wpf - CollectionViewSource 是如何工作的?

wpf - 在 WPF 中绑定(bind) DataGridTextColumn 可见性属性

c# - 使用 ListBox 通过 MVVM 导航 TextBox

wpf - 将 WPF 控件设置为扩展以填充可用空间,仅此而已

c# - 尝试以编程方式将图像添加到资源。设置图片源时出现System.ArgumentException

c# - 在C#中创建不同的画笔图案