2013-04-17 44 views
6

Tôi đang phát triển một Word Add-In với tab Ribbon của riêng nó. Hầu hết mã thực tế của tôi có chứa trong một số lớp Service được khởi tạo trong ThisAddIn_Startup và được gán cho các thuộc tính của đối tượng singleton ThisAddIn. Tôi cũng có một trình lắng nghe sự kiện lắng nghe các sự kiện clipboard mà tôi muốn hiển thị với phần còn lại của mã như một thuộc tính của cùng một đối tượng.Ribbon tùy chỉnh được tải trước ThisAddIn_Startup, nhưng tôi muốn khởi tạo một số thứ ở đó - giải pháp tốt nhất?

Sự cố mà tôi đang gặp phải là sự kiện Tải băng của tôi kích hoạt trước sự kiện Khởi động của ThisAddIn (mặc dù đối tượng đơn lẻ đã được khởi tạo và gán cho Globals.ThisAddIn). Trong trình xử lý sự kiện Load của Ribbon, tôi muốn cài đặt một trình xử lý trên trình lắng nghe đó và cũng sử dụng một trong các dịch vụ đó. Tôi không thể, mặc dù, bởi vì vào thời điểm này trong chương trình thực hiện họ là null.

Giải pháp tốt nhất cho vấn đề này là gì? Tôi chỉ có thể làm cho tất cả những điều này thành viên tĩnh của ThisAddIn và khởi tạo chúng trong một constructor tĩnh, nhưng điều đó có vẻ sai và cũng phá hủy toàn bộ điểm có một sự kiện Startup (hoặc một đối tượng singleton).

Thật kỳ lạ, ban đầu tôi không gặp phải vấn đề này khi Ribbon của tôi chỉ thêm các thành phần của nó vào tab Add-In tích hợp - sau đó sự kiện Load được kích hoạt sau khi khởi động.

(Lưu ý: Tôi đang làm tất cả điều này trong Visual Studio 2012 và sử dụng thiết kế Ribbon.)

Trả lời

5

Đối với mục đích này tôi đang trọng BeginInit phương pháp. Từ sự kiện kinh nghiệm của tôi occure theo thứ tự (băng/khởi tạo có liên quan):

  1. CreateRibbonExtensibilityObject
  2. BeginInit
  3. GetCustomUI
  4. Ribbon_Load
  5. ThisAddIn_Startup
1

Tôi đã thử nghiệm các giải pháp của tinamou, nó không hoạt động nữa. Ribbon_load thực sự xảy ra sau khi BeginInit nhưng ở bước này ribbon là cố định và chỉ đọc. Không có cách nào để thêm các nút nhóm .. (tuy nhiên, có thể sửa đổi các menu động).

Tôi nghĩ cách tốt nhất (ổn định) là tải trước một số nhóm v.v. và sử dụng thuộc tính điều khiển visibility để có được loại dải băng động.

Xem thêm bài đăng này localize VSTO addin according to the language of the office product, có vẻ như là CreateRibbonExtensibilityObject được kích hoạt vào các thời điểm ngẫu nhiên.

+2

Tôi thực sự không sử dụng câu trả lời được chấp nhận ở trên nữa. (Phản ứng SO thích hợp cho điều này là gì? Tôi có nên thêm một cái mới và di chuyển chấp nhận không?) Những gì tôi làm là chỉnh sửa hàm tạo trong Ribbon.Designer.cs để gọi phương thức "ManualInitialize". Mã này bao gồm mọi thứ không phụ thuộc vào ThisAddIn_Startup. Sau đó tôi thêm một phương thức khác trong Ribbon.cs "FinalStartup" được gọi bởi ThisAddIn_Startup có chứa mọi thứ mà * làm * phụ thuộc vào ThisAddIn_Startup. –

+0

Tôi nghĩ bạn nên xóa câu trả lời được chấp nhận và để câu hỏi của bạn chưa được trả lời. Có thể ai đó sẽ tìm ra cách tốt hơn. – Malick