来自 shapesheet 用户操作的 Visio VSTO 加载项 QueueMarker 事件,添加一个形状但在重做时获得两个形状

Posted

技术标签:

【中文标题】来自 shapesheet 用户操作的 Visio VSTO 加载项 QueueMarker 事件,添加一个形状但在重做时获得两个形状【英文标题】:Visio VSTO Add-in QueueMarker event from shapesheet user action, adding one shape but getting two shapes upon Redo 【发布时间】:2021-10-21 23:44:03 【问题描述】:

在 Visio 页面上的 Visio 形状上,将 Office 加载项功能添加到 Visio 形状上的右键单击鼠标菜单的唯一方法是使用 QUEUEMARKEREVENT shapesheet function。

不幸的是,这种让用户在 Visio 形状上使用功能的方式会导致撤消/重做系统出现问题。

我在下面制作了一些示例代码,可以将其放入 Visual Studio 中的新 Visio VSTO VB.NET 项目中(我使用的是 2019,Visio 也是 2019 版)

编译 VSTO 加载项,当 Visio 启动时,选择一个基本图表,因为它会打开我用于测试的模板。

按照此屏幕截图,在页面上拖放一个形状并编辑 ShapeSheet 以添加一个动作部分:

在此形状的右键菜单中,您将找到“测试”菜单项。运行此项目,页面将添加一个新的方形。

现在使用撤消,然后执行重做。如果您移动新形状,您会看到它下面有一个相同的正方形。重做不会添加一个,而是添加两个新形状。

我想我误解了 QueueMarker 事件的工作原理。我只是一个业余开发人员,希望有人知道如何可靠地解决这个问题,因为可靠的撤消/重做行为对于一个好的插件应用程序非常重要。感谢您分享您的见解!

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 Class

【问题讨论】:

【参考方案1】:

我认为 MarkerEvent 在重做时会生成两次。您能否在处理之前检查 ContextString 是否为 == "Test" 并查看它是否有帮助?

【讨论】:

对此进行了测试,但在重做时提供了相同的 ContextString,因此代码也在重做时执行。 带有 ContextString "Test" 的 Application_MarkerEvent 是否在重做时执行两次? Markerevent 在重做时只执行一次,并按预期使用“测试”上下文字符串执行。

以上是关于来自 shapesheet 用户操作的 Visio VSTO 加载项 QueueMarker 事件,添加一个形状但在重做时获得两个形状的主要内容,如果未能解决你的问题,请参考以下文章

office visio 2013 professional激活问题,我之前下载了一个全能激活工具,然后按照网上的经验操作

Visio快捷键-小结(Microsoft Visio绘图工具)

Visio基本操作

如何在word中使用visio

Visio 学习笔记 —— Visio 的键盘快捷方式

Visio 学习笔记 —— Visio 的键盘快捷方式