Visio VSTO 拖放

Visio VSTO Drag and Drop

我正在尝试为 Visio 2013 和 2015 创建自定义 VSTO 加载项,其中我在锚视图中有一个项目列表。我想允许用户从列表中拖动一个项目并将其放到 Visio 页面上。一旦掉落,我想使用掉落的 x 和 y 坐标,以便我可以创建特定的形状和连接器。我无法找到任何说明如何完成此操作的文章或示例。我找到的唯一参考是关于如何为 Word 2010 实现此目的的,我无法获得他们用于 Word 的技术用于 Visio。

如有任何帮助和指导,我们将不胜感激。

其实没那么复杂。这个(我的)相当老 post 解释了如何从内存流中删除形状:

http://unmanagedvisio.blogspot.co.at/2010/05/persisting-visio-shapes.html

如果你想从模板上的现有母版中删除(下面的代码假设 "Basic shapes",那么它可能会更容易。你只需要在你的表单中处理 "Item drag" 然后设置将对象拖动到所需的母版。DoDragDrop 是一个内置函数(下面的代码假定为 winforms,对于不同的框架,您可能需要不同的方法)。无论如何,基本思想是 "Master" visio 对象实现 IDataObject 接口,这足以使拖放工作。

假设您的列表视图有两个项目,名为 "Triangle" 和 "Circle",如果您拖动 "triangle" 项目,您应该得到 "triangle" 形状并且对于 "circle",圆圈,分别.

    private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
    {
        var item = (ListViewItem) e.Item;

        var app = Globals.ThisAddIn.Application;

        var myStencil = app.Documents.OpenEx("BASIC_M.VSS", 
            (short)VisOpenSaveArgs.visOpenDocked | (short)VisOpenSaveArgs.visOpenRO);

        var masterToDrag = myStencil.Masters[item.Text];
        var data = new DataObject(masterToDrag);
        DoDragDrop(data, DragDropEffects.Copy);
    }