2011-09-07 4 views
1

나는 이상하게 들리 겠지만 사실입니다.바인딩은 Visio 이벤트가 발사되는 것을 방지합니다.

Visio 컨트롤을 호스팅하는 WPF 응용 프로그램이 있습니다. 거기에 아무런 문제가 없습니다. DocumentOpened와 같은 일부 필수 이벤트가 작동합니다.

예를 들어 BeforeShapeDeleted, CellChanged와 같은 다른 이벤트를 처리하려는 경우 Shapes를 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

...

의 windowActivated 또한 컨트롤이 실행 모드로 전환 할 때 발생한다, 사물은 시간에 나중에 시점에서 일반적으로 "더 준비"입니다. 내 컴퓨터에서 Visio에 문제가있는 것 같습니다.

0

, 당신은 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이 없다는 것을 배우고 나를 놀라게하지 않을 또는 Window_Loaded 핸들러 동안 this.visioControl.Window가 일부 메소드 호출에 준비되지 않았 음을 나타냅니다.

예외가 전혀 없습니까? (또는 일부를 처리하고 일부를 처리하는 프레임 워크가있어서 처리기 중 생각하는 모든 코드를 실행하지 않을 수 있습니다 ...)

Visio 이벤트 스파이 프로그램이 있습니다. 너는 위로보고 싶을지도 모르다. VisOcx 인스턴스 내의 페이지 및 셰이프와 관련된 이벤트에 등록 할 때 더 적합한 이벤트가있을 수 있습니다. 나는 마이크로 소프트와 접촉했다

+0

안녕하세요 @ DLRdave! 귀하의 답변에 감사드립니다. CellChanged에 특정 모양을 붙이려고했으나 같은 행운이 없었습니다. ActivePage.Shapes를 통해 쉽게 반복 할 수 있기 때문에 ActivePage는 DocumentOpened에서 사용할 수 있습니다. 예외도 보이지 않지만 Visio Spy를 사용해 보겠습니다. 어쨌든, 그것은 여전히 ​​바인딩 라인을 제거 할 때 모든 것이 작동하기 시작하는 이유를 설명하지 못합니다. –