2013-04-01 27 views
5

Trong ứng dụng biểu mẫu Windows của tôi được viết bằng C# Tôi có một loạt các nút. Khi chuột của người dùng di chuột qua một nút, tôi muốn đường viền của nút thay đổi.Chia sẻ trình xử lý sự kiện trên nhiều điều khiển

Hiện nay tôi có nhiều trường hợp các nội dung sau (bản sao cho mỗi nút):

private void btnStopServer_MouseEnter(object sender, EventArgs e) 
{ 
    oldColor = btnStopServer.FlatAppearance.BorderColor; 
    btnStopServer.FlatAppearance.BorderColor = mouseOverColor; 
} 

private void btnStopServer_MouseLeave(object sender, EventArgs e) 
{ 
    btnStopServer.FlatAppearance.BorderColor = oldColor; 
} 

Kể từ khi tôi có rất nhiều nút, mã để thay đổi màu của đường viền của nút chiếm rất nhiều không gian.

Có cách nào đơn giản hơn để tôi có thể thực hiện việc này không?

Trả lời

5

Bạn nên kết nối một đơn MouseEnterMouseLeave cho mỗi điều khiển cần chức năng này (thay vì viết phiên bản mới của từng phương pháp cho mỗi điều khiển). Giả sử bạn đang sử dụng Visual Studio, điều này có thể được thực hiện bằng cách thay đổi tên phương thức đích cho sự kiện, trong mỗi thuộc tính của Button. Nếu bạn viết mã sau trước, thì phương thức này sẽ xuất hiện trong danh sách thả xuống của các thuộc tính MouseEnterMouseLeave sự kiện.

Mã này sau đó sẽ cần phải kiểm tra nút mà từ đó sự kiện này đã bị sa thải, như sau:

private void btnWithHoverBorder_MouseEnter(object sender, EventArgs e) 
{ 
    Button eventButton = (Button) sender; 
    oldColor = eventButton.FlatAppearance.BorderColor; 
    eventButton.FlatAppearance.BorderColor = mouseOverColor; 
} 

private void btnWithHoverBorder_MouseLeave(object sender, EventArgs e) 
{ 
    Button eventButton = (Button) sender; 
    eventButton.FlatAppearance.BorderColor = oldColor; 
} 

Tôi đoán oldColor là một toàn cầu? Điều này có thể bị mất đồng bộ nếu có điều gì đó "kỳ quặc" xảy ra khi sự kiện MouseEnter của bạn được kích hoạt cho một nút khác, trước khi bắt gặp MouseLeave tương ứng. Để làm cho điều này mạnh mẽ hơn, tôi sẽ xem xét việc lưu trữ màu cũ trên thuộc tính của .tag của Button, để nó được khép kín.

Ví dụ:

private void btnWithHoverBorder_MouseEnter(object sender, EventArgs e) 
{ 
    Button eventButton = (Button) sender; 
    eventButton.tag = eventButton.FlatAppearance.BorderColor; 
    eventButton.FlatAppearance.BorderColor = mouseOverColor; 
} 

private void btnWithHoverBorder_MouseLeave(object sender, EventArgs e) 
{ 
    Button eventButton = (Button) sender; 
    eventButton.FlatAppearance.BorderColor = (Color)eventButton.tag; 
} 

(Thẻ về cơ bản là một cái móc trên đó gắn thẻ "bất cứ điều gì" liên quan đến một trường hợp cụ thể của một điều khiển, rằng không có đã là một tài sản cho Đó là kiểu Object đó. có nghĩa là bạn có thể gắn thẻ bất kỳ thứ gì ở đó, nhưng khi bạn đọc từ đó, bạn cần truyền lại cho bất kỳ loại nào bạn đặt ở vị trí đầu tiên.Nhưng vì nó là Object, bạn có thể đặt bất kỳ thứ gì ở đó, bao gồm ví dụ: lớp tùy chỉnh chứa nhiều các thuộc tính hoặc một mảng, v.v. nếu bạn cần gắn thẻ một điều khiển với nhiều thứ).

+0

Cảm ơn bạn! Chính xác những gì tôi muốn. – davidwroxy

+0

@davidwroxy Hoàn toàn là người bạn tình của tôi, và cảm ơn vì đã chấp nhận! Tôi lưu ý bạn hiếm khi "chấp nhận" các câu trả lời khác mà (có thể) đã trả lời các câu hỏi của bạn. Nếu bạn có một khoảnh khắc, bạn sẽ nhớ đánh dấu là "chấp nhận" những câu trả lời (nếu có) mà _have_ giải quyết vấn đề của bạn, và/hoặc upvote những người đã được hữu ích cho bạn? – Sepster

+0

Tôi vừa hoàn thành việc đánh dấu các câu trả lời đã giải quyết được vấn đề của mình. Tôi quên làm điều này. Cảm ơn bạn đã nhắc nhở tôi. – davidwroxy

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