En las formas de Visio en una página de Visio, la única forma de agregar la funcionalidad del complemento de Office al menú contextual del mouse en las formas de Visio es usar la función de hoja de forma QUEUEMARKEREVENT .
Desafortunadamente, esta forma de permitir que el usuario use la funcionalidad en una forma de Visio está causando problemas con el sistema Deshacer/Rehacer.
He creado un código de muestra a continuación que se puede colocar en un nuevo proyecto Visio VSTO VB.NET en Visual Studio (uso 2019, Visio también la versión 2019)
Compile el complemento de VSTO y, cuando se inicie Visio, elija un Diagrama básico que abra la plantilla que uso para la prueba.
Coloque una forma en la página y edite ShapeSheet para agregar una sección de acción, como se muestra en esta captura de pantalla:
En esta forma, en el menú contextual, encontrará el elemento de menú "Prueba". Ejecute este elemento y se agregará una nueva forma cuadrada a la página.
Ahora use Deshacer y luego realice un Rehacer. Si mueve la nueva forma, verá que debajo hay una forma cuadrada idéntica. Un Redo no agrega una, sino dos formas nuevas.
Creo que estoy malinterpretando algo sobre cómo funcionan los eventos de QueueMarker. Solo soy un desarrollador aficionado, espero que alguien sepa cómo solucionar esto de manera sólida, ya que el comportamiento confiable de Deshacer/Rehacer es muy importante para una buena aplicación de complemento. ¡Gracias por compartir tus conocimientos!
Imports System.Windows.Forms Imports System.Diagnostics Imports System.Text Imports Visio = Microsoft.Office.Interop.Visio Partial Public Class ThisAddIn Private Sub Application_MarkerEvent(app As Visio.Application, SequenceNum As Integer, ContextString As String) Handles Application.MarkerEvent Dim Stencil As Visio.Document Stencil = GetStencil() If Stencil Is Nothing Then MessageBox.Show("The Basic Shapes stencil is closed, please open it before running this action.") Exit Sub End If Dim Square As Visio.Shape Square = Application.ActivePage.Drop(Stencil.Masters.ItemU("Square"), 0, 0) End Sub Private Function GetStencil() As Visio.Document Dim DocCounter As Long For DocCounter = 1 To Application.Documents.Count If Application.Documents(DocCounter).Type = Visio.VisDocumentTypes.visTypeStencil Then If Application.Documents(DocCounter).Name = "BASIC_M.vssx" Or Application.Documents(DocCounter).Name = "BASIC_U.vssx" Then 'MessageBox.Show(Application.Documents(DocCounter).Name) Return Application.Documents(DocCounter) Exit Function End If End If Next DocCounter Return Nothing End Function End ClassCreo que MarkerEvent se genera dos veces en Redo. ¿Puede verificar que ContextString sea == "Prueba" antes de procesarlo y ver si ayuda?