绑定可防止Visio事件触发
我知道这听起来很奇怪,但确实如此。
我有一个简单的WPF应用程序,它承载了一个Visio控件。 这没有问题。 一些重要的事件,如DocumentOpened确实有效。
但是,如果我想处理其他事件,例如BeforeShapeDeleted,CellChanged,它们会在将图形绑定到DocumentOpened中的ListBox后停止触发。
这是我的代码:
public partial class MainWindow : Window { private AxMicrosoft.Office.Interop.VisOcx.AxDrawingControl visioControl = new AxMicrosoft.Office.Interop.VisOcx.AxDrawingControl(); public MainWindow() { InitializeComponent(); this.host.Child = this.visioControl; } private void Window_Loaded(object sender, 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); } void Application_CellChanged(Microsoft.Office.Interop.Visio.Cell Cell) { MessageBox.Show("Changed"); } void Application_BeforeShapeDelete(Microsoft.Office.Interop.Visio.Shape Shape) { MessageBox.Show("Deleted"); } void visioControl_DocumentOpened(object sender, AxMicrosoft.Office.Interop.VisOcx.EVisOcx_DocumentOpenedEvent e) { //if I comment the line bellow BeforeShapeDelete and CellChanged will work, if I leave it uncommented, they won't work... lstShapes.ItemsSource = this.visioControl.Window.Application.ActivePage.Shapes; } private void mnuOpen_Click(object sender, RoutedEventArgs e) { Microsoft.Win32.OpenFileDialog dlgOpenDiagram = new Microsoft.Win32.OpenFileDialog(); if (dlgOpenDiagram.ShowDialog() == true) { this.visioControl.Src = dlgOpenDiagram.FileName; } } }
问题在于定义了一个ItemsSource的行中的DocumentOpened方法...
根据您的代码,您正在注册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也应该在控制进入运行模式时触发,并且在稍后的时间点通常会“更加准备好......”
我正在与微软联系。 看起来我在我的机器上遇到了Visio问题。
链接地址: http://www.djcxy.com/p/41829.html