Tôi tương đối mới với WPF, và một số thứ với nó khá lạ với tôi. Đối với một, không giống như Windows Forms, hệ thống phân cấp điều khiển WPF không hỗ trợ IDisposable. Trong Windows Forms, nếu một điều khiển người dùng sử dụng bất kỳ tài nguyên được quản lý nào, rất dễ dàng để dọn sạch tài nguyên bằng cách ghi đè phương thức Vứt bỏ mà mọi điều khiển được thực hiện.Dọn dẹp đúng cách các điều khiển người dùng WPF
Trong WPF, câu chuyện không đơn giản như vậy. Tôi đã tìm kiếm điều này trong vài giờ và gặp hai chủ đề cơ bản:
Chủ đề đầu tiên là Microsoft nêu rõ rằng WPF không triển khai IDisposable vì các điều khiển WPF không có tài nguyên không được quản lý. Trong khi điều đó có thể đúng, họ dường như đã hoàn toàn bỏ lỡ thực tế là các phần mở rộng của người dùng đến phân cấp lớp WPF của họ thực sự có thể sử dụng các tài nguyên được quản lý (trực tiếp hoặc gián tiếp thông qua một mô hình). Bằng cách không triển khai IDisposable, Microsoft đã gỡ bỏ một cách hiệu quả cơ chế được bảo đảm duy nhất mà tài nguyên không được quản lý được sử dụng bởi một điều khiển WPF hoặc cửa sổ tùy chỉnh có thể được dọn dẹp.
Thứ hai, tôi đã tìm thấy một vài tham chiếu đến Dispatcher.ShutdownStarted. Tôi đã cố gắng sử dụng sự kiện ShutdownStarted, nhưng nó dường như không kích hoạt mọi điều khiển. Tôi có một bó của WPF UserControl mà tôi đã thực hiện một xử lý cho ShutdownStarted, và nó không bao giờ được gọi. Tôi không chắc chắn nếu nó chỉ hoạt động cho Windows, hoặc có lẽ là lớp ứng dụng WPF. Tuy nhiên nó không phải là đúng cách bắn, và tôi đang bị rò rỉ các đối tượng PerformanceCounter mở mỗi khi ứng dụng đóng lại.
Có cách nào tốt hơn để dọn sạch tài nguyên không được quản lý hơn sự kiện Dispatcher.ShutdownStarted không? Có một số thủ thuật để thực hiện IDisposable sao cho Dispose sẽ được gọi? Tôi muốn nhiều hơn tránh sử dụng trình hoàn thiện nếu có thể.
+1 để di chuyển tài nguyên dùng một lần ra khỏi codebehind. Một trong những điểm học tập chính của WPF là giảm thiểu hệ thống mã hóa để tận dụng lợi thế của sức mạnh và tính biểu cảm của kiến trúc dữ liệu. Đó là một điều khó khăn để tìm hiểu (đường cong học tập giống như leo lên một vách đá), nhưng bổ ích khi bạn "nhận" chế độ suy nghĩ của WPF. –
Tất cả các tài nguyên dùng một lần đều thực sự trong ViewModel, là bản thân IDisposable. Tôi thực sự bối rối về lý do tại sao sự kiện Dispatcher.ShutdownStarted không kích hoạt. Kiểm soát truy cập hiệu suất (và ViewModel liên quan của nó) thực sự được gắn vào biểu đồ WPF khi nó được nhúng vào trong một trong một . –
jrista
@Greg D: Tôi thường nhận được mô hình WPF. Tôi bắt đầu sử dụng MVVM ngay sau khi tôi đã nắm bắt được những điều cơ bản của WPF, và CodeBehind của tôi là khá nhiều như trần như nó được (chỉ đơn giản là constructor mặc định và các cuộc gọi của nó để InitializeComponent). Khả năng composability và databinding của WPF là tuyệt vời hơn, và tôi sẽ không bao giờ quay trở lại các hình thức cửa sổ nếu tôi có sự lựa chọn. – jrista