C# 如何将ListViewItem放到画布上并渲染该项目包含的图像?

C# 如何将ListViewItem放到画布上并渲染该项目包含的图像?,c#,wpf,canvas,C#,Wpf,Canvas,我有一个“Module”类型的自定义对象,我在其中存储一个图像和一个名称。这些对象存储在ListView中,在这里我将它们拖放到画布上,这样我可以排列它们(有点像拼图)。首先,我只是画了一张图: var module = e.Data.GetData("MyFormat") as Module; Canvas CanvasView = sender as Canvas; Image image = new Image(); image.Source = module.ModuleImage;

我有一个“Module”类型的自定义对象,我在其中存储一个图像和一个名称。这些对象存储在ListView中,在这里我将它们拖放到画布上,这样我可以排列它们(有点像拼图)。首先,我只是画了一张图:

var module = e.Data.GetData("MyFormat") as Module;
Canvas CanvasView = sender as Canvas;

Image image = new Image();
image.Source = module.ModuleImage;

Point enterPoint = e.GetPosition(this.moduleCanvas);

Point PointToDraw = new Point(0, 0);
PointToDraw.X = enterPoint.X - DropPosition.X;
PointToDraw.Y = enterPoint.Y - DropPosition.Y;

//+35 and +43 so the Module gets dropped in the way you picked it up
image.SetValue(Canvas.LeftProperty, PointToDraw.X + 35);
image.SetValue(Canvas.TopProperty, PointToDraw.Y + 43);

CanvasView.Children.Add(image);
但后来我意识到,我需要画布上的一个对象,而不仅仅是一个图像,所以我尝试了以下方法:

ListViewItem lvitem = new ListViewItem();
var module = e.Data.GetData("MyFormat") as Module;
Canvas CanvasView = sender as Canvas;

lvitem.Content = module;
CanvasView.Children.Add(lvitem);

但这当然不会在画布上渲染图像。它只告诉我
MyNamespace.Module
。如何使画布呈现ListViewItem包含的对象的图像?

如果
模块的
Image
属性返回实际的
Image
元素,则可以将
Content
属性设置为:

lvitem.Content = module.Image;
如果
Image
返回路径,则可以使用
ContentTemplate
Content
属性设置为
ContentControl
,您可以使用
FrameworkElementFactory
XamlReader.Parse以编程方式创建该属性。在
ContentTemplate
中,定义
Image
元素:

ContentControl cc = new ContentControl();
cc.Content = new LongTextConverter();

FrameworkElementFactory frameworkElementFactory = new FrameworkElementFactory(typeof(Image));
frameworkElementFactory.SetBinding(Image.SourceProperty, new Binding("Image"));
cc.ContentTemplate = new DataTemplate() { VisualTree = frameworkElementFactory };

lvitem.Content = cc;

或者使用
列表视图
画布
作为
项目面板
。有关示例,请参见。然后,您可以将
列表视图的
项源设置为
IEnumerable
,并定义一个
项模板
,该模板将应用于每个
模块

使画布成为项控件的项面板。将itemssource绑定到itemviewmodel的集合。将Datetemplate itemviewmodel转换为您想要的任何内容。每个项目都在一个容器中。将canvas.left和canvas.top绑定到itemviewmodel中的x和y属性。如果你在谷歌上搜索,你应该能够找到一大堆如何做到这一点的例子。很确定我以前在msdn上发布过。好吧,模块包含一个ImageSource,但即使我做
lvitem.Content=Module.Image我仍然只在画布上保留图像,而不是整个图像object@DudeWhoWantsToLearn字体我想那是你想要的。但是您仍然可以使用
ContentPresenter
ContentTemplate
,正如我建议的那样。显然,
Canvas
不可能在你不告诉它的情况下就知道你想如何呈现一个
模块
对象。我想要一个类似winforms的编辑器,在那里我可以从列表中拖放对象,重新排序并使它们交换数据。就像一个拼图编辑器,拼图告诉你什么时候完成,这与你的问题“如何将ListViewItem放到画布上并渲染该项目包含的图像?”有什么关系?我相信它已经得到了回答。我需要画布上的对象,但我希望呈现模块的图像,而不是“mynamespace.module”。不仅仅是图像,我还需要一个物体。就像一个列表视图。您将对象存储在其中,但您可以选择如何显示项目。我的图片和名字如下。但它仍然是一个对象,我可以使用它