在内存中而不是在屏幕上呈现WPF用户控件

贾维尔斯

我有一个复杂的用户控件,该控件显示图像并在其上方的某些标签上覆盖阴影和其他东西。我想在内存中渲染所有这些东西,然后制作此地图的图像,然后在真实的用户界面中使用此图像。这就是事情的结局。

在此处输入图片说明

之所以这样做,是因为界面开始随着所有这些元素的变化而缓慢移动,因此我试图简化它。我要走正确的路吗?

这里的问题是我创建了brainMap,向其提供数据,然后尝试创建imagen和BAM!由于无法渲染整个组件,ActualWith为零,因此无法完成。

这就是我从控件中提取图像的方式(当控件在屏幕上呈现时,该方法非常有效)

    /// <summary>
    /// The controls need actual size, If they are not render an "UpdateLayout()" might be needed.
    /// </summary>
    /// <param name="control"></param>
    /// <param name="Container"></param>
    public static System.Windows.Controls.Image fromControlToImage(System.Windows.FrameworkElement control)
    {
        if (control.ActualWidth == 0)
            throw new Exception("The control has no size, UpdateLayout is needed");
     // Here is where I get fired if the control was not actually rendered in the screen

        RenderTargetBitmap rtb = new RenderTargetBitmap((int)control.ActualWidth, (int)control.ActualHeight, 96, 96, PixelFormats.Pbgra32);
        rtb.Render(control);

        var bitmapImage = new BitmapImage();
        var bitmapEncoder = new PngBitmapEncoder();
        bitmapEncoder.Frames.Add(BitmapFrame.Create(rtb));

        using (var stream = new System.IO.MemoryStream())
        {
            bitmapEncoder.Save(stream);
            stream.Seek(0, System.IO.SeekOrigin.Begin);

            bitmapImage.BeginInit();
            bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
            bitmapImage.StreamSource = stream;
            bitmapImage.EndInit();
        }
        System.Windows.Controls.Image testImage = new System.Windows.Controls.Image();
        testImage.Source = bitmapImage;
        return testImage;
    }

如果控件在开始时是布局的一部分,则添加UpdateLayout确实可以解决问题(这就是我在那里为自己添加一个异常的原因),但是当控件是通过代码创建而从未到达页面时,UpdateLayout根本没有帮助。

如何确保在内存中呈现所有元素,然后在不进入页面的情况下呈现其图像?(可以接受固定尺寸)

Smartis

在您的情况下,解决方案将如下所示:

 public static System.Windows.Controls.Image fromControlToImage(System.Windows.FrameworkElement control)
 {
    Size size = new Size(100, 100); // Or what ever size you want...
    control.Measure(size);
    control.Arrange(new Rect(size));
    control.UpdateLayout();
    ...
 }

在SO中经常问在内存中租用WPF

将控制绘制到内存

由于控件没有父容器,因此您需要调用Measure and Arrange来进行正确的布局。

WPF获取内存中UIElement的大小

您需要强制渲染项目,或等待渲染项目。然后,您可以使用ActualHeight和ActualWidth属性。

为您的目的的附加:

在内存中强制渲染WPF控件

可能您可以使用ViewBox在内存中进行渲染

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

内存中用户定义的表,不是在内存中?

来自分类Dev

从 WPF 中的主窗口引发用户控件上的事件

来自分类Dev

WPF用户控件中的命令

来自分类Dev

WPF:在win10上从WebBrowser控件中的文本框调用屏幕键盘

来自分类Dev

ffmpeg-在内存而不是磁盘中输出图像

来自分类Dev

在WPF中的用户控件之间传递数据

来自分类Dev

用户控件MVVM中的WPF更改视图

来自分类Dev

共享库中的WPF用户控件

来自分类Dev

WPF用户控件中的边距

来自分类Dev

WPF OnPropertyChanged用于ItemsControl中的用户控件

来自分类Dev

用户控件MVVM中的WPF更改视图

来自分类Dev

在MainWindow中重用WPF用户控件

来自分类Dev

为什么用户选择会呈现在屏幕上?

来自分类Dev

访问控件不是XAML用户控件中的属性

来自分类Dev

我可以通过绑定到wpf父控件上的属性的依赖项属性在xaml中设置用户控件datacontext吗?

来自分类Dev

在WPF中的用户控件上创建可绑定属性的正确方法是什么?

来自分类Dev

在“添加新的用户控件”按钮上单击“在WPF MVVM中单击命令”

来自分类Dev

如何将Web用户控件呈现到PlaceHolder中

来自分类Dev

页面中的XAML Xamarin用户控件未呈现内容

来自分类Dev

用户控件而不是按钮

来自分类Dev

如何将屏幕截图保存在内存中,并使用Ctrl + P将其粘贴到其他应用程序(例如Outlook)上

来自分类Dev

WPF用户控件+ MVVM

来自分类Dev

wpf用户控件的DataGrid

来自分类Dev

WPF 用户控件拖放

来自分类Dev

WPF:将焦点集中在用户控件的不同实例上

来自分类Dev

WPF & Prism:单选按钮选择在多个用户控件上消失

来自分类Dev

用户控件中嵌套DataGrid中的WPF SelectedItem属性

来自分类Dev

自定义UITableViewCell中的UILabels无法在屏幕上呈现

来自分类Dev

在内存(不是文件)上调用fsi

Related 相关文章

  1. 1

    内存中用户定义的表,不是在内存中?

  2. 2

    从 WPF 中的主窗口引发用户控件上的事件

  3. 3

    WPF用户控件中的命令

  4. 4

    WPF:在win10上从WebBrowser控件中的文本框调用屏幕键盘

  5. 5

    ffmpeg-在内存而不是磁盘中输出图像

  6. 6

    在WPF中的用户控件之间传递数据

  7. 7

    用户控件MVVM中的WPF更改视图

  8. 8

    共享库中的WPF用户控件

  9. 9

    WPF用户控件中的边距

  10. 10

    WPF OnPropertyChanged用于ItemsControl中的用户控件

  11. 11

    用户控件MVVM中的WPF更改视图

  12. 12

    在MainWindow中重用WPF用户控件

  13. 13

    为什么用户选择会呈现在屏幕上?

  14. 14

    访问控件不是XAML用户控件中的属性

  15. 15

    我可以通过绑定到wpf父控件上的属性的依赖项属性在xaml中设置用户控件datacontext吗?

  16. 16

    在WPF中的用户控件上创建可绑定属性的正确方法是什么?

  17. 17

    在“添加新的用户控件”按钮上单击“在WPF MVVM中单击命令”

  18. 18

    如何将Web用户控件呈现到PlaceHolder中

  19. 19

    页面中的XAML Xamarin用户控件未呈现内容

  20. 20

    用户控件而不是按钮

  21. 21

    如何将屏幕截图保存在内存中,并使用Ctrl + P将其粘贴到其他应用程序(例如Outlook)上

  22. 22

    WPF用户控件+ MVVM

  23. 23

    wpf用户控件的DataGrid

  24. 24

    WPF 用户控件拖放

  25. 25

    WPF:将焦点集中在用户控件的不同实例上

  26. 26

    WPF & Prism:单选按钮选择在多个用户控件上消失

  27. 27

    用户控件中嵌套DataGrid中的WPF SelectedItem属性

  28. 28

    自定义UITableViewCell中的UILabels无法在屏幕上呈现

  29. 29

    在内存(不是文件)上调用fsi

热门标签

归档