C# 如何将ListViewItem放到画布上并渲染该项目包含的图像?
我有一个“Module”类型的自定义对象,我在其中存储一个图像和一个名称。这些对象存储在ListView中,在这里我将它们拖放到画布上,这样我可以排列它们(有点像拼图)。首先,我只是画了一张图: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;
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”。不仅仅是图像,我还需要一个物体。就像一个列表视图。您将对象存储在其中,但您可以选择如何显示项目。我的图片和名字如下。但它仍然是一个对象,我可以使用它