Связывание предотвращает запуск событий Visio - PullRequest
1 голос
/ 07 сентября 2011

Я знаю, это звучит странно, но это правда.

У меня есть простое приложение WPF, которое содержит элемент управления Visio.С этим проблем нет.Некоторые важные события, такие как DocumentOpened, действительно работают.

Но если я хочу обработать другие события, например, BeforeShapeDeleted, CellChanged, они прекращают запускаться, когда я связываю Shapes с ListBox в DocumentOpened.1006 * Вот мой код:

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;
        }
    }
}

Проблема заключается в методе DocumentOpened в строке, которая определяет ItemsSource ...

Ответы [ 2 ]

0 голосов
/ 11 ноября 2011

Я общался с Microsoft. Похоже, у меня были проблемы с Visio на моей машине.

0 голосов
/ 09 сентября 2011

Согласно вашему коду, вы подписываетесь на событие CellChanged в объекте Application. Вы действительно хотите все события 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 и активации в нем окна ... Меня не удивит, когда я узнаю об отсутствии ActivePage во время DocumentOpened или что this.visioControl .Window не готово для некоторых вызовов методов во время вашего обработчика Window_Loaded.

Соблюдаете ли вы какие-либо исключения? (Или фреймворк обрабатывает некоторые и скрывает их от вас, так что вы, возможно, не выполняете весь код, который, как вы думаете, вы используете во время ваших обработчиков ...?)

Существует программа-шпион Visio, которую вы, возможно, захотите найти. Может быть более подходящее событие, которое вы можете подключить, чтобы подписаться на события, связанные со страницами и фигурами в экземпляре VisOcx.

WindowActivation также должна запускаться, когда элемент управления переходит в режим выполнения, и в этот более поздний момент времени все «более готово» ...

...