2011-09-07 65 views
1

我知道這聽起來很奇怪,但它是真實的。綁定防止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方法...

+0

這是Visio 2007嗎? – gordatron

回答

0

我是在與微軟接觸。看起來我在我的機器上遇到了Visio問題。

0

根據你的代碼,你報名參加了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控制和它激活的窗口時發生的事件的順序......這不會讓我感到吃驚地瞭解到,在DocumentOpened時間內沒有ActivePage,或在您的Window_Loaded處理程序中,this.visioControl.Window尚未準備好進行某些方法調用。

你是否觀察到任何異常? (或者是一個處理一些並隱藏它們的框架,這樣你可能不會執行你在你的處理程序期間的所有代碼......?)

有一個Visio事件間諜程序在那裏,你可能想看看。可能有一個更合適的事件可以掛鉤以註冊與VisOcx實例中的頁面和形狀相關的事件。

的windowActivated也應該火時,控制進入運行模式,事情一般都是「更願意」在那個時間點以後...

+0

嗨@DLRdave!感謝您的回答。我試圖將CellChanged附加到特定的形狀,但運氣不足。 ActivePage在DocumentOpened中可用,因爲我可以輕鬆地遍歷ActivePage.Shapes。我也沒有看到任何例外,但我會嘗試Visio Spy。無論如何,它仍然不能解釋爲什麼當刪除綁定線時,一切都開始工作。 –

相關問題