Câu trả lời cplotts dán là tốt nhưng có thể không áp dụng trong trường hợp của bạn bởi vì nó rời khỏi hoạt ảnh gắn liền với tài sản IsOpen, hiệu quả khóa nó tại chỗ và ngăn không cho nó bị thay đổi thông qua thiết lập thuộc tính trực tiếp, ràng buộc và các cách khác . Điều này có thể gây khó khăn cho việc sử dụng với mã của bạn, tùy thuộc vào cách bạn đang sử dụng nó.
Nếu đúng như vậy, tôi sẽ chuyển sang bắt đầu một DispatcherTimer khi bạn muốn mở một cửa sổ bật lên sau khi một số chậm trễ, như thế này:
_popupTimer = new DispatcherTimer(DispatcherPriority.Normal);
_popupTimer.Interval = TimeSpan.FromMilliseconds(100);
_popupTimer.Tick += (obj, e) =>
{
_popup.IsOpen = true;
};
_popupTimer.Start();
Đối với một hành vi ToolTip-như thế này có thể được thực hiện trên MouseEnter . Nếu bạn muốn hủy bỏ việc mở cửa sổ bật lên vì một lý do (chẳng hạn như nếu chuột rời khỏi kiểm soát trước khi popup xuất hiện), chỉ cần:
_popupTimer.Stop();
Cập nhật
Như cplotts obseved trong các bình luận, bạn cũng sẽ muốn đặt _popup.IsOpen = false
trong một số trường hợp trong sự kiện MouseLeave, tùy thuộc vào logic của bạn để xử lý các sự kiện nhập/thoát chuột giữa điều khiển của bạn và cửa sổ bật lên. Lưu ý rằng bạn thường không muốn đặt một cách mù quáng IsOpen=false
trên mọi sự kiện MouseLeave, vì nó có thể làm như vậy khi cửa sổ bật lên xuất hiện trên đó. Điều này sẽ trong một số trường hợp dẫn đến một popup nhấp nháy. Vì vậy, bạn sẽ cần một số logic ở đó.
Nguồn
2010-01-13 01:56:07
Điểm tốt ... và ý tưởng hay. Bạn cũng có thể muốn xóa giá trị IsOpen trong MouseLeave trong giải pháp trên. – cplotts
Có thể bạn sẽ muốn làm điều này, nhưng cẩn thận. Tôi sẽ cập nhật câu trả lời của mình để giải thích ý tôi là gì. –
Ray, cảm ơn rất nhiều! Đây chính là chức năng mà tôi cần. – Stewbob