2009-12-09 34 views
7

Vấn đề của tôi là tôi đã tạo một điều khiển RichTextBox "mở rộng" sử dụng API gốc để thêm nhiều tính năng RichEdit bị thiếu trong điều khiển tiêu chuẩn (ví dụ: sửa đổi một thuộc tính phông chữ đơn trên vùng chọn) o thay đổi các thuộc tính phông chữ khác, bọc từ thành máy in [như WordPad], v.v.). Là một phần của điều khiển tôi trưng ra một PrintDocument được sử dụng để in các nội dung được định dạng của RichTextBox. Khi wordwrap được thiết lập để "Wrap To Printer" tôi SendMessage tin nhắn EM_SETTARGETDEVICE cho RichTextBox và làm cho nó để bọc đến độ dài thích hợp.C# PrintDocument Sự kiện đã thay đổi

Tất cả đều hoạt động tốt khi có điều gì đó (người dùng/mã) thay đổi thuộc tính WordWrap của điều khiển của tôi. Tuy nhiên nếu PrintDocument được sửa đổi sau đó tôi không có cách nào để biết nó. Vì vậy, mặc dù người dùng có thể đã thay đổi lề trên PrintDocument RichTextBoxEx của tôi không gửi lại EM_SETTARGETDEVICE cho chiều rộng mới cho đến khi thuộc tính WordWrap được thay đổi.

Tôi thấy một vài tùy chọn để khắc phục điều này nhưng tôi không phải là một fan hâm mộ lớn của bất kỳ người trong số họ. Dưới đây là những gì tôi có:

  1. Thêm một phương pháp UpdatePrintDocument() hoặc tương tự mà sẽ cần phải được gọi sau khi một cái gì đó bên ngoài từ sự kiểm soát (ví dụ: một PageSetupDialog trên form cha) được cập nhật các thiết lập trong PrintDocument. Nhược điểm: Tôi sẽ phân phối sự kiểm soát vì vậy tôi muốn làm cho nó thân thiện nhất có thể. Mặc dù tôi có thể nhớ gọi phương thức này bất cứ khi nào tôi cập nhật thành công cài đặt PrintDocument mà người khác có thể không. Pro: Thật đơn giản để thực hiện.

  2. Tạo một lớp PrintDocumentEx mới dựa trên PrintDocument và triển khai các sự kiện "Đã thay đổi" cần thiết. Nhược điểm: Có thể không đủ, có thể cần tạo PrintSettingsEx, PageSettingsEx, v.v. Pro: Triển khai một lần và không ai phải lo lắng về nó nữa.

Tôi thực sự nghĩ rằng # 2 là tùy chọn tôi sẽ phải thực hiện nhưng không thể tái sử dụng cho trường hợp tiếp theo tôi cần một số chức năng tương tự. Tôi đoán những gì tôi đang tìm kiếm là một cách để đính kèm một "chung PropertyChanged sự kiện" cho bất kỳ tài sản lớp học hiện có kể từ khi điều này sẽ được áp dụng trong các tình huống trong tương lai. Lo lắng để xem những gì các bạn có cho tôi :-)

+0

Thời gian là vấn đề nên tôi đã tiếp tục và bắt đầu triển khai PrintDocumentEx. Như tôi mong đợi các hộp thoại in WinForms không tạo các PageSettings, PrinterSettings mới, vv nhưng sửa đổi các thuộc tính hiện có, vì vậy tôi sẽ cần tạo các lớp "Ex" cho tất cả các đối tượng và bong bóng sự kiện "Đã thay đổi" của tôi cho mỗi thuộc tính lá trở lại PrintDocumentEx . Đó là khó chịu nhưng tiến bộ của nó. Vẫn còn lo lắng để xem nếu có một giải pháp chung chung hơn tôi đang mất tích. –

+0

Chỉ cần theo dõi rằng lớp PrintDocumentEx (và được liên kết) của tôi đã không hoạt động.Nhìn vào PrintDialog và các điều khiển liên quan, đó là vì chúng sử dụng các phương thức gốc để cập nhật một cách kịp thời PrintDocument. Vì vậy, các sự kiện tôi gắn liền với các thuộc tính trong các lớp "Ex" của tôi không bao giờ bị sa thải bởi vì accessor đã được thiết lập chưa bao giờ được gọi. Bây giờ tôi đã đi với phương thức UpdatePrintDocument() nhưng vẫn đang tìm kiếm một giải pháp tốt hơn. –

+0

Thú vị là tôi có thể tạo ra một câu hỏi vô dụng (câu hỏi có tiền thưởng với một câu trả lời không được chấp nhận) một bài đăng trên cộng đồng wiki. –

Trả lời

1

Chỉ cần theo dõi rằng lớp PrintDocumentEx (và được liên kết) của tôi đã không hoạt động. Nhìn vào PrintDialog và các điều khiển liên quan, đó là vì chúng sử dụng các phương thức gốc để cập nhật một cách kịp thời PrintDocument. Vì vậy, các sự kiện tôi gắn liền với các thuộc tính trong các lớp "Ex" của tôi không bao giờ bị sa thải bởi vì accessor đã được thiết lập chưa bao giờ được gọi.

+0

Có, bạn đã làm: 'Tạo tiền thưởng 100 đại diện cho câu hỏi id = 1871103 ngày 15 tháng 12 lúc 4: 49' –

1

Nếu tôi đã hiểu chính xác câu hỏi của bạn, thông tin bạn yêu cầu được gửi khi thuộc tính WordWrap bị thay đổi.

Khi những thứ khác được thay đổi, không có sự kiện nào cập nhật Tài liệu in. Lần sau thuộc tính WordWrap được thay đổi, tất cả thông tin sẽ được gửi đi.

Cách hack để sửa lỗi này là sau đó thay đổi thuộc tính WordWrap, bất cứ khi nào bạn thay đổi thuộc tính mà bạn muốn gửi tới Tài liệu In. Thay đổi nó thành một giá trị tạm thời, sau đó thay đổi nó trở lại.

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