绑定可防止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

上一篇: Binding Prevents Visio Events from Firing

下一篇: Problem with WebBrowser Control