【问题标题】:Binding Prevents Visio Events from Firing绑定防止 Visio 事件触发
【发布时间】:2011-11-12 03:57:56
【问题描述】:

我知道这听起来很奇怪,但这是真的。

我有一个托管 Visio 控件的简单 WPF 应用程序。没有问题。一些重要的事件,例如 DocumentOpened 确实有效。

但如果我想处理其他事件,例如 BeforeShapeDeleted、CellChanged,一旦我将 Shapes 绑定到 DocumentOpened 中的 ListBox,它们就会停止触发。

这是我的代码:

公共部分类 MainWindow : 窗口 { 私有 AxMicrosoft.Office.Interop.VisOcx.AxDrawingControl visioControl = new AxMicrosoft.Office.Interop.VisOcx.AxDrawingControl(); 公共主窗口() { 初始化组件(); this.host.Child = this.visioControl; } 私人无效Window_Loaded(对象发送者,RoutedEventArgs e) { this.visioControl.DocumentOpened += new AxMicrosoft.Office.Interop.VisOcx.EVisOcx_DocumentOpenedEventHandler(visioControl_DocumentOpened); this.visioControl.Window.Application.BeforeShapeDelete += new Microsoft.Office.Interop.Visio.EApplication_BeforeShapeDeleteEventHandler(Application_BeforeShapeDelete); this.visioControl.Window.Application.CellChanged += new Microsoft.Office.Interop.Visio.EApplication_CellChangedEventHandler(Application_CellChanged); } 无效 Application_CellChanged(Microsoft.Office.Interop.Visio.Cell 单元) { MessageBox.Show("改变"); } 无效 Application_BeforeShapeDelete(Microsoft.Office.Interop.Visio.Shape 形状) { MessageBox.Show("已删除"); } void visioControl_DocumentOpened(对象发送者,AxMicrosoft.Office.Interop.VisOcx.EVisOcx_DocumentOpenedEvent e) { //如果我注释下面的行,BeforeShapeDelete 和 CellChanged 将起作用,如果我不注释它,它们将不起作用... lstShapes.ItemsSource = this.visioControl.Window.Application.ActivePage.Shapes; } private void mnuOpen_Click(对象发送者,RoutedEventArgs e) { Microsoft.Win32.OpenFileDialog dlgOpenDiagram = new Microsoft.Win32.OpenFileDialog(); if (dlgOpenDiagram.ShowDialog() == true) { this.visioControl.Src = dlgOpenDiagram.FileName; } } }

问题在于定义 ItemsSource 的行中的 DocumentOpened 方法...

【问题讨论】:

    标签: .net wpf activex vsto visio


    【解决方案1】:

    根据您的代码,您正在注册 Application 对象上的 CellChanged 事件。你真的想要整个应用程序中所有的 CellChanged 事件吗?

        this.visioControl.Window.Application.BeforeShapeDelete += new Microsoft.Office.Interop.Visio.EApplication_BeforeShapeDeleteEventHandler(Application_BeforeShapeDelete);
        this.visioControl.Window.Application.CellChanged += new Microsoft.Office.Interop.Visio.EApplication_CellChangedEventHandler(Application_CellChanged);
    

    我不记得在打开 Visio 控件并激活其中的窗口时发生的事件的顺序...得知 DocumentOpened 时没有 ActivePage 或 this.visioControl 不会让我感到惊讶.Window 尚未准备好在 Window_Loaded 处理程序期间进行某些方法调用。

    您是否观察到任何异常情况? (或者是一个框架处理一些并将它们隐藏起来,这样您可能不会在处理程序期间执行您认为自己正在执行的所有代码......?)

    那里有一个 Visio 事件间谍程序,您可能想查找它。可能有一个更合适的事件,您可以在 VisOcx 实例中注册与页面和形状相关的事件。

    当控件进入运行模式时,WindowActivated 也应该触发,并且事情通常在稍后的时间点“更准备好”......

    【讨论】:

    • 嗨@DLRdave!感谢您的回答。我试图将 CellChanged 附加到特定形状,但同样缺乏运气。 ActivePage 在 DocumentOpened 中可用,因为我可以轻松地遍历 ActivePage.Shapes。我也没有看到任何异常,但我会尝试 Visio Spy。无论如何,它仍然没有解释为什么当移除该绑定线时一切都开始工作了。
    【解决方案2】:

    我曾与 Microsoft 联系。我的机器上的 Visio 似乎有些问题。

    【讨论】: