2014-07-03 14 views
11

Đây chỉ là vấn đề lạ trong Win8.1. Như chúng ta đã biết, nếu có một ứng dụng đang chạy trong một máy, sẽ không có bất kỳ hành vi nào khác chống lại ứng dụng khi chúng ta kết nối/ngắt kết nối/kết nối lại với máy này bằng Remote Desktop Connection. Tuy nhiên, chúng tôi thấy rằng Win8.1 sẽ kích hoạt các sự kiện tải và tải xuống ứng dụng WPF khi chúng ta đóng và kết nối lại với máy bằng RDC. Và đây là hành vi không mong muốn có thể gây ra lỗi.Win8.1 sẽ kích hoạt tải và tải sự kiện lên ứng dụng WPF khi chúng tôi đóng và kết nối lại với máy này bằng RDC từ win7 hoặc hệ điều hành khác

Dưới đây là các bước sinh sản ổn định:

  1. Viết một ứng dụng WPF, trong đó có một nút và xử lý dỡ bỏ và tải các sự kiện của nút này.
  2. Sử dụng RDC để kết nối với Win8.1 từ Win7 chẳng hạn.
  3. Trong màn hình từ xa, hãy chạy ứng dụng WPF này. (Sự kiện tải sẽ được ghi trong tệp tin a.txt).
  4. Đóng RDC bằng cách nhấp vào 'x'.
  5. Kết nối lại với Win8.1 này.
  6. Bạn sẽ thấy các sự kiện tải và tải đã được kích hoạt.

Nếu ứng dụng WPF chạy trong Win7 hoặc máy chủ Win 2008, những sự kiện đó sẽ không được kích hoạt.

Vì vậy, tôi nghĩ đó là hành vi không mong muốn trong Win8.1. Đó có phải là một lỗi trong RDP Win8.1 không? Hay đó là một tính năng mới?

+0

Ai đó có thể giúp tôi không? Và nếu cần, bạn có thể tải xuống chương trình thử nghiệm của tôi trên https://www.hightail.com/download/ZUczbUpha0Q3N0RvS3NUQw. Chương trình này sẽ viết một tập tin a.txt trong cùng một đường dẫn để ghi lại các sự kiện.Vì vậy, hãy bỏ qua cảnh báo từ phần mềm chống vi-rút của bạn. – capcom923

+0

Tôi biết nó khá xa vời nhưng tôi có cùng một vấn đề. Bạn đã tìm thấy một giải pháp? – SiriusNik

+0

Tôi gặp vấn đề tương tự, có bất kỳ cập nhật nào không? –

Trả lời

0

Điều này xảy ra do việc kết nối lại RDP thông báo mã WPF rằng ứng dụng phiên mà phiên và màn hình đã thay đổi. WPF cần phải xây dựng lại tài nguyên DirectX của nó và có thể xử lý kích thước màn hình được cập nhật (mặc dù độ phân giải có thể giống nhau). Điều này có ý nghĩa b/c khách hàng RDP có thể chỉ định các khả năng khác nhau như mức đồ họa và các thuộc tính khác từ tab "Kinh nghiệm" RDP. WPF không xác định rằng các tham số đều giống như lần cuối kết nối xảy ra và nó kích hoạt chu trình render và layout mới (có ý nghĩa vì màu sắc và độ phân giải màn hình có thể đã thay đổi). Điều này dẫn đến các điều khiển được tải lại và một sự kiện mới được nạp.

Bạn có thể thấy nhiều chi tiết đẫm máu về điều này bằng cách kiểm tra HwndTarget.cs trong nguồn .NET. Tìm kiếm tập tin này cho "phiên" và bạn sẽ thấy rất nhiều xử lý cho phiên ngắt kết nối/kết nối lại.

http://referencesource.microsoft.com/#PresentationCore/Core/CSharp/System/Windows/Interop/HwndTarget.cs,f20f989ef219e391

Nếu bạn muốn tìm một cách để tránh làm thêm công việc trong mã Loaded/bốc dỡ của bạn, bạn có thể phải di chuyển nó đến một chức năng mà bạn chắc chắn rằng bạn chỉ gọi một lần qua một lá cờ hoặc kiểm tra null .

Bạn có thể chứng kiến ​​điều đang xảy ra bằng cách thêm điểm ngắt trên trình xử lý sự kiện được tải và chuyển đến Công cụ> Tùy chọn, Gỡ lỗi và bỏ chọn "Bật Chỉ mã của tôi" và chọn "Bật nguồn khung khuôn khổ .NET" và chọn " Bật hỗ trợ máy chủ nguồn ". Khi bạn kết nối RDP, bkpt sẽ kích hoạt và ngăn xếp cuộc gọi sẽ hiển thị một sự kiện thay đổi kích thước giữa các cấp độ gọi khác nhau. Điều này có lẽ do WPF cũng nhận được WM_DISPLAYCHANGE và có mọi thứ bố cục lại trong trường hợp có độ phân giải ít hơn nhiều với kết nối này.

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