2012-10-01 28 views
5

Cả NewDocument lẫn sự kiện DocumentOpen đều được kích hoạt khi Microsoft Word tải lần đầu tiên. Khi một thể hiện của Word đã được mở và một tài liệu mới hoặc hiện có được mở ra thì các sự kiện này sẽ hoạt động tốt.Cách xử lý sự kiện Word DocumentChange vì sự kiện NewDocument không được kích hoạt khi tải

Đề xuất tôi đã xem là xử lý sự kiện DocumentChange (luôn được kích hoạt khi Word tải) thay vì hai sự kiện khác.

Câu hỏi của tôi là làm cách nào để tôi thực hiện việc này? Sự kiện DocumentChange không có bất kỳ tham số nào vì vậy làm cách nào tôi biết khi nào tài liệu (mới hoặc hiện tại) vừa được mở?

Ngoài ra, tôi đã có logic trong sự kiện DocumentChange và việc xử lý tài liệu mới và hiện có khác nhau nên tôi không thể ném tất cả mã của mình vào sự kiện.

private void ThisAddIn_Startup(object sender, System.EventArgs a) 
{ 
    this.Application.DocumentChange += new ApplicationEvents4_DocumentChangeEventHandler(Application_DocumentChange); 
} 

private void Application_DocumentChange() 
{ 
    // How do I handle NewDocument or DocumentOpen? 
} 

Trả lời

2

Vì vậy, tôi đã kết thúc xử lý tài liệu được tải trong ThisAddIn_Startup. Nếu đường dẫn của tài liệu là một chuỗi rỗng, thì chúng ta biết rằng tài liệu là mới và chưa bao giờ được lưu trên máy cục bộ. Khác, tôi biết nó được lưu (bao gồm trong thư mục tạm thời) và tôi xử lý nó như một tài liệu hiện có.

private void ThisAddIn_Startup(object sender, System.EventArgs a) 
{ 
    try 
    { 
    Word.Document doc = this.Application.ActiveDocument; 
    if (String.IsNullOrWhiteSpace(doc.Path)) 
    { 
     ProcessNewDocument(doc); 
    } 
    else 
    { 
     ProcessDocumentOpen(doc); 
    } 
    } 
    catch (COMException e) 
    { 
    log.Debug("No document loaded with word."); 
    } 

    // These can be set anywhere in the method, because they are not fired for documents loaded when Word is initialized. 
    ((MSWord.ApplicationEvents4_Event)this.Application).NewDocument += 
    new MSWord.ApplicationEvents4_NewDocumentEventHandler(Application_NewDocument); 
    this.Application.DocumentOpen += 
    new MSWord.ApplicationEvents4_DocumentOpenEventHandler(Application_DocumentOpen); 
} 

Như nhận xét của tôi đối với các quốc gia trả lời Deni của: Thiết xử lý sự kiện DocumentOpen trong Initialize ThisAddIn.Desiger.cs() của phương pháp làm việc cho các tài liệu hiện có, nhưng NewDocument không được gọi cho một tài liệu mới được khởi tạo khi Word mở ra, vì vậy giải pháp này không hoạt động. Vì vậy, tôi đã để lại thiết lập của DocumentOpen và NewDocument trong sự kiện ThisAddIn_Startup, nếu không DocumentOpen sẽ được kích hoạt khi một tài liệu nạp với Word.

2

This liên kết sẽ giúp bạn, về cơ bản những gì họ nói là ThisAddIn_Startup chạy sau sự kiện DocumentOpen đã chạy xong. Ngoài ra còn có một giải pháp cho vấn đề chỉ cần làm theo các siêu liên kết.

+0

Điều này hoạt động hoàn hảo cho _DocumentOpen nhưng không hoạt động cho _NewDocument. Tôi nhớ đọc ở đâu đó rằng _NewDocument chỉ được kích hoạt khi người dùng thực hiện File-> New và không khi Word mở bằng một tài liệu mới. Nếu điều này là đúng, bất kỳ ý tưởng về cách xử lý một tài liệu mới khi từ mở ra? _WindowActivate kích hoạt mỗi khi Word lấy tiêu điểm, không chỉ lần đầu tiên Word mở ra. Vì vậy, tôi có thể cố gắng xử lý _WindowActivate nhưng tôi cảm thấy như thế có thể bị lộn xộn. Suy nghĩ? –

1

Tôi đã sử dụng bộ sưu tập Application.Documents trong trình xử lý Khởi động để tìm tất cả tài liệu tồn tại trước khi tải bổ trợ của tôi. Nó hoàn thành cùng một điều mà câu trả lời của bạn làm, cộng thêm, nếu bạn nạp bổ trợ sau này (thay vì khi Word bắt đầu) vì lý do gì, liệt kê bộ sưu tập có thể nhận được nhiều hơn chỉ là tài liệu đang hoạt động.

Sự kiện DocumentChange() kích hoạt bất cứ khi nào ActiveDocument thay đổi. Word chỉ có một tài liệu hoạt động tại một thời điểm. Chuyển đổi giữa nhiều tài liệu Word mở sẽ kích hoạt sự kiện. Ngoài ra, khi đóng tài liệu, sự kiện có thể kích hoạt khi một tài liệu mở khác hoạt động. Nó cũng sẽ kích hoạt sau khi tài liệu cuối cùng đóng lại, trong trường hợp này, Application.ActiveDocument sẽ không hợp lệ.

Các vấn đề liên quan