2010-03-08 38 views
5

Pre .net Tôi đã sử dụng MFC, ON_UPDATE_COMMAND_UI và lớp CCmdUI để cập nhật trạng thái giao diện người dùng cửa sổ của tôi. Từ tài liệu tham khảo MFC/Win32 cũ hơn:Cập nhật đối tượng giao diện người dùng trong các hình thức cửa sổ

Thông thường, các mục menu và nút thanh công cụ có nhiều trạng thái. Đối với ví dụ , một mục menu có màu xám (bị mờ) nếu không có sẵn trong ngữ cảnh hiện tại . Các mục menu cũng có thể được kiểm tra hoặc bỏ chọn . Thanh công cụ cũng có thể bị vô hiệu hóa nếu không có hoặc có thể kiểm tra.

Ai cập nhật trạng thái của các mục này khi điều kiện chương trình thay đổi? Về mặt logic, nếu một mục trình đơn tạo ra một lệnh được xử lý bằng, ví dụ: tài liệu , bạn cần có tài liệu cập nhật mục menu. Tài liệu có thể chứa thông tin mà thông tin cập nhật là dựa.

Nếu lệnh có nhiều đối tượng giao diện người dùng (có thể là một menu mục và nút thanh công cụ), cả hai đều là được chuyển đến cùng một hàm điều khiển. Mã này đóng gói mã cập nhật giao diện người dùng cho tất cả các đối tượng giao diện người dùng tương đương trong một địa điểm duy nhất.

Khuôn khổ cung cấp giao diện thuận tiện để tự động cập nhật các đối tượng giao diện người dùng . Bạn có thể chọn để cập nhật theo cách khác, nhưng giao diện được cung cấp là hiệu quả và dễ sử dụng.

Hướng dẫn cho biểu mẫu Windows .net là gì? Tôi đang sử dụng một trình xử lý Application.Idle ở dạng chính nhưng tôi không chắc đây là cách tốt nhất để làm điều này. Khoảng thời gian tôi đặt tất cả các cập nhật giao diện người dùng trong trình xử lý sự kiện Idle, ứng dụng của tôi bắt đầu hiển thị một số vấn đề về hiệu suất và tôi chưa có số liệu để theo dõi điều này. Không chắc chắn nếu nó có liên quan.

+0

biết chính xác là bạn đang cố gắng để làm một lần nữa? Bạn đang cố gắng vô hiệu hóa các điều khiển trên các ứng dụng WinForms? –

+0

Tắt/bật các nút trên thanh công cụ, các mục menu, vv Kiểm tra/bỏ chọn các nút kiểm tra trên thanh công cụ, các mục menu hiển thị trạng thái kiểm tra. Đó là loại điều. Công cụ rất thường xuyên. –

+2

Có, Application.Idle. Làm thế nào bạn có thể có một vấn đề perf khi ứng dụng nhàn rỗi là bí ẩn. –

Trả lời

1

Tôi đã tìm thấy nó dễ nhất để có trình xử lý sự kiện mục menu tạo ra một chuỗi nền vô hiệu hóa mục menu, thực hiện công việc và sau đó bật lại mục menu. Bằng cách đó, giao diện người dùng có sẵn để xử lý các yêu cầu giao diện người dùng khác và tôi không cần phải thăm dò ý kiến ​​khi hoạt động hoàn tất.

Tôi thường bao gồm logic ngăn nhiều hoạt động sử dụng cùng một tài nguyên để xảy ra đồng thời. Điều này có nghĩa là tạo ra một chức năng để vô hiệu hóa/kích hoạt tất cả các tài nguyên tương tự cùng một lúc. ví dụ. Tôi chỉ có thể cho phép 1 thao tác tệp xảy ra cùng một lúc, vì vậy tôi sẽ tạo một chức năng để vô hiệu hóa/bật tất cả các mục menu được liên kết với các thao tác tệp và gọi nó từ mọi mục menu.

0

Chỉ cần thay đổi thuộc tính của chúng, ví dụ:

obj.Enabled = true; 

hoặc

obj.Enabled = false; 

Thuộc tính của đối tượng đó sẽ tự động gọi .Invalidate() hoặc .Refresh() cho bạn, vì vậy việc kiểm soát phải được sơn lại tự động.

Nếu bạn muốn thực hiện tác vụ LỚN sẽ chặn giao diện người dùng trong nhiều giây, bạn nên sử dụng Threads + Delegates.

+0

Đó là những gì tôi làm bây giờ trong trình xử lý Application.Idle ở dạng chính. Tôi đang cố gắng tìm hiểu xem khi nào và ở đâu những người khác đang làm điều này. Tôi không thể sử dụng dữ liệu ràng buộc kể từ khi trình đơn devexpress và thanh công cụ tôi sử dụng không cung cấp dữ liệu ràng buộc cho việc này. –

+0

cũng điều này có nghĩa là để thổi lên các Application.Idle-xử lý cho các hình thức lớn hơn. bạn thực sự không nên làm điều này. chỉ cần làm điều đó khi cần thiết. ví dụ: thêm một sự kiện onclick vào một nút. trong trình xử lý của bạn, hãy tắt một điều khiển khác. không đặt điều này trong application.idle. –

1

AFAIK, trong thế giới .NET System.Windows.Forms chuẩn, chức năng này không khả dụng trong hộp. Vấn đề này có thể được trả lời theo một vài cách. Các liên kết dưới đây là tài nguyên hữu ích:

OnUpdate equivalent

ActionLists for Windows forms

Command UI Updating Windows Forms in C#

+1

Tôi đã thấy một số liên kết này trước đây và tôi đã triển khai thực hiện mẫu lệnh. Tất cả những kẻ này đang làm là sử dụng sự kiện Application.Idle để cập nhật. Tôi đoán rằng tất cả đều có nó. Cách cũ C++ MFC là khá mát mẻ tuy nhiên. –

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