C# - Is there any OnShapeMoved or OnShapeDeleted event in Visio?

家住魔仙堡 提交于 2019-12-11 08:08:43

问题


I think the title or the question is clear enough. I saw something about the EventSink, but I found it difficult to use. Any hint?


回答1:


I believe that you have to implement EvenSink to get access to "ShapesDeleted", i.e.

 (short)Microsoft.Office.Interop.Visio.VisEventCodes.visEvtCodeShapeDelete

the code above will help you if you are looking for the event "BeforeShapeDelete" not the "after"ShapeDelete ;)




回答2:


The Visio Primary Interop Assembly exposes these events as C# events therefore you can simply hook the event with a delegate.

See this simple example:

namespace VisioEventsExample
{
    using System;
    using Microsoft.Office.Interop.Visio;

    class Program
    {
        public static void Main(string[] args)
        {
            Application app = new Application();
            Document doc = app.Documents.Add("");
            Page page = doc.Pages[1];

            // Setup event handles for the events you are intrested in.

            // Shape deleted is easy.
            page.BeforeShapeDelete += 
                new EPage_BeforeShapeDeleteEventHandler(onBeforeShapeDelete);

            // To find out if a shape has moved hook the cell changed event 
            // and then check to see if PinX or PinY changed.
            page.CellChanged += 
                new EPage_CellChangedEventHandler(onCellChanged);

            // In C# 4 for you can simply do this:
            //            
            //   page.BeforeShapeDelete += onBeforeShapeDelete;
            //   page.CellChanged += onCellChanged;

            // Now wait for the events.
            Console.WriteLine("Wait for events. Press any key to stop.");
            Console.ReadKey();
        }

        // This will be called when a shape sheet cell for a
        // shape on the page is changed. To know if the shape
        // was moved see of the pin was changed. This will 
        // fire twice if the shape is moved horizontally and 
        // vertically.
        private static void onCellChanged(Cell cell)
        {
            if (cell.Name == "PinX" || cell.Name == "PinY")
            {
                Console.WriteLine(
                    string.Format("Shape {0} moved", cell.Shape.Name));
            }            
        }

        // This will be called when a shape is deleted from the page.
        private static void onBeforeShapeDelete(Shape shape)
        {
            Console.WriteLine(string.Format("Shape deleted {0}", shape.Name));
        }
    }
}

If you haven't already downloaded the Visio SDK you should do so. Recent versions of the SDK it contains many useful examples include one called "Shape Add\Delete Event". If you have the 2010 version can browse the examples by going to Start Menu\Programs\Microsoft Office 2010 Developer Resources\Microsoft Visio 2010 SDK\Microsoft Visio Code Samples Library.



来源:https://stackoverflow.com/questions/6141307/c-sharp-is-there-any-onshapemoved-or-onshapedeleted-event-in-visio

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!