【问题标题】:Show a rendered image of a UIelement(Visual) in an Image control WPF在图像控件 WPF 中显示 UIelement(Visual) 的渲染图像
【发布时间】:2018-05-03 04:39:30
【问题描述】:

我正在开发一个应用程序,并且我想实现一个类似于 Microsoft Power Point 的分页系统的功能,在该系统旁边有一个您正在处理的工作表的较小图像。

我有以下函数可以渲染用户必须在其中工作的网格图像。

private void CreateImageOfPage()
    {
        int width = (int)this.WorkSheetViewModelList.Last().RootGrid.Width;
        int height = (int)this.WorkSheetViewModelList.Last().RootGrid.Height;
        RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
        renderTargetBitmap.Render(this.WorkSheetViewModelList.Last().RootGrid);
        PngBitmapEncoder pngImage = new PngBitmapEncoder();
        pngImage.Frames.Add(BitmapFrame.Create(renderTargetBitmap));

        JpegBitmapEncoder encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
        Guid photoID = System.Guid.NewGuid();

        String photolocation = "Temp/"+photoID.ToString() + ".png";
        using (var filestream = new FileStream(photolocation, FileMode.Create))
            encoder.Save(filestream);
        Console.WriteLine(Path.GetFullPath(photoID.ToString() + ".png"));
    }

我的问题是,如何获取、设置或格式化保存图像的路径以设置为 XAML 中的图像源?当前形式的路径如下所示:“D:\Project\bin\Debug\7fd77420-f62e-44e7-b206-b5ce19f01a9e.png”,它说它无法在这个位置获取文件(现在我只是复制了输出,但它应该是绑定的)。

如果我采取的路径不优雅,有没有其他方法可以做得更好,或者根本不将图像保存到磁盘?

谢谢!

【问题讨论】:

    标签: c# wpf imagesource


    【解决方案1】:

    您不需要进行任何图像编码。

    假设有一个名为 image 的 Image 元素,您可以像这样直接将 RenderTargetBitmap 分配给它的 Source 属性:

    image.Source = renderTargetBitmap;
    

    您可以将方法更改为:

    private ImageSource CreateImageOfPage()
    {
        var rootGrid = WorkSheetViewModelList.Last().RootGrid;
        var width = (int)rootGrid.ActualWidth;
        var height = (int)rootGrid.ActualHeight;
        var renderTargetBitmap = new RenderTargetBitmap(
            width, height, 96, 96, PixelFormats.Pbgra32);
        renderTargetBitmap.Render(rootGrid);
        return renderTargetBitmap;
    }
    

    并像这样使用它:

    image.Source = CreateImageOfPage();
    

    【讨论】:

    • 感谢您的回答。我试图把这些碎片放在一起,看起来创建的图像没有出现。我在 XAML 文件中有以下内容: 我已将返回值分配给一个名为 Source (public ImageSource Source) 的属性。
    • 您已将 Image 的 Source 属性绑定到视图模型中的 Source 属性(其中 Mode=TwoWay 没有意义)。视图模型属性是否通知值更改,例如通过触发 INotifyPropertyChanged 接口的 PropertyChanged 事件?
    • 是的,确实如此。这里是:私有 ImageSource _source;公共 ImageSource 源 { 获取 { 返回 this._source; } 设置 { this._source = value; this.RaisePropertyChanged(); RaisePropertyChanged 方法是实现 INotifyPropertyChanged 接口的类的一部分。对于其他属性,它运行良好。
    • 应该可以。尝试使用 RootGrid 的 ActualWidth 和 ActualHeight 而不是 Width 和 Height,如编辑后的答案所示。
    • 我改了还是什么都没有,没有出现。
    猜你喜欢
    • 1970-01-01
    • 2017-02-18
    • 2014-09-11
    • 2011-02-16
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多