Tôi đang sử dụng một số hành vi Blend và trình kích hoạt trên điều khiển đèn bạc. Tôi tự hỏi nếu có bất kỳ cơ chế tự động tách hoặc đảm bảo rằng OnDetaching() được gọi cho một hành vi hoặc kích hoạt khi kiểm soát không còn được sử dụng (tức là loại bỏ khỏi cây thị giác).Tự động gọi OnDetaching() cho Hành vi Silverlight
Vấn đề của tôi là có một rò rỉ bộ nhớ được quản lý với sự kiểm soát vì một trong những hành vi. Hành vi này đăng ký một sự kiện trên một số đối tượng tồn tại lâu dài trong ghi đè OnAttached() và nên hủy đăng ký khỏi sự kiện đó trong ghi đè OnDetaching() để nó có thể trở thành một ứng cử viên cho việc thu thập rác. Tuy nhiên, OnDetaching() dường như không bao giờ được gọi khi tôi loại bỏ điều khiển khỏi cây thị giác ... cách duy nhất tôi có thể làm cho nó xảy ra là bằng cách loại bỏ một cách rõ ràng các hành vi có vấn đề TRƯỚC KHI tháo kiểm soát và sau đó nó được thu gom đúng cách .
Ngay bây giờ giải pháp duy nhất của tôi là tạo ra một phương pháp nào trong code-behind cho sự kiểm soát có thể đi qua và tách bất kỳ hành vi nổi tiếng có thể gây ra vấn đề thu gom rác thải. Nó sẽ được vào mã khách hàng để biết để gọi này trước khi loại bỏ sự kiểm soát từ bảng điều khiển. Tôi không thực sự thích cách tiếp cận này, vì vậy tôi đang tìm một số cách tự động để làm điều này mà tôi đang xem hoặc một gợi ý tốt hơn.
public void DetachBehaviors()
{
foreach (var behavior in Interaction.GetBehaviors(this.LayoutRoot))
{
behavior.Detach();
}
//continue detaching all known problematic behaviors on the control....
}
Cảm ơn! Cách tiếp cận này hoạt động tốt cho nhu cầu của chúng tôi. – Jaans