2015-06-10 15 views
5

Tôi đang làm việc trên ứng dụng WPF nơi tôi có sự kiện nhấp đúp ở mức cửa sổ giúp tối đa hóa cửa sổ ứng dụng khi người dùng tăng gấp đôi nhấp vào bất kỳ nơi nào trong cửa sổ. Tuy nhiên, tôi cũng có một điều khiển tùy chỉnh trong cửa sổ ứng dụng và một sự kiện nhấp đúp riêng biệt trong điều khiển tùy chỉnh. Khi người dùng nhấp đúp vào điều khiển tùy chỉnh, chỉ sự kiện nhấp đúp của kiểm soát mới kích hoạt và cửa sổ sẽ không thay đổi kích thước. Mã của tôi trông giống như sau:Nhấp đúp vào sự kiện xảy ra ở mức cửa sổ và mức điều khiển, ngay cả khi nó được xử lý trong phạm vi kiểm soát

public class Window 
{ 
    private void window_DoubleClick(object sender, EventArgs e) 
    { 
     /// Maximize/minimize window 
    } 

    private void myCustomControl_DoubleClick(object sender, EventArgs e) 
    { 
     /// Do other things, but PLEASE don't resize! 
     e.Handled = true; 
    } 
} 

Và XAML của tôi trông giống như sau:

<Window x:class="MyProject.MyWindow" 
    MouseDoubleClick="window_DoubleClick"> 
    <Grid Grid.Row="0" Margin="0"> 
     <local:myCustomControl 
      MouseDoubleClick="myCustomControl_DoubleClick"/> 
    </Grid> 
</Window> 

Thật không may, với mã này tại chỗ, khi người dùng click đúp chuột trong việc kiểm soát, sự kiện điều khiển hỏa hoạn, nhưng sự kiện Window cũng cháy. Tôi đã thử thiết lập e.Handled = true trong sự kiện điều khiển, nhưng sự kiện Window vẫn cháy. Điều duy nhất mà đã ngừng mức Window kích đúp vào sự kiện từ bắn được xử lý xem trước các điều khiển tùy chỉnh của double-click kiện sử dụng này:

private void myCustomControl_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    e.Handled = true; 
} 

Mặc dù sự kiện preview dừng Window kích đúp vào trước khi nó có thể bắn, Tôi không thể sử dụng nó mà không cần phải cấu trúc lại một chút mã. Điều khiển tùy chỉnh của tôi có một vài điều khiển con cũng xử lý sự kiện nhấp đúp của nó. Nếu sự kiện xem trước được gọi ở cấp độ kiểm soát của cha mẹ, sự kiện nhấp đúp không bao giờ đường hầm xuống qua các điều khiển con và do đó nhấp đúp không làm những gì tôi muốn. Nếu có thể, tôi muốn tránh phải tái cấu trúc bất kỳ mã nào trong các điều khiển con. Điều đó đang được nói, câu hỏi của tôi là: Có cách nào để dừng sự kiện nhấp đúp ở cấp cửa sổ không khi sự kiện nhấp đúp đã được xử lý? Tôi đã lái xe bản thân mình điên cố gắng để tìm ra điều này .. bất kỳ trợ giúp được đánh giá cao!

+1

Vui lòng xem ["Câu hỏi có nên bao gồm" thẻ "trong tiêu đề của họ không?"] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), trong đó sự đồng thuận là "không, họ không nên"! –

Trả lời

2

Vấn đề là, MouseDoubleClick chỉ xuất hiện để bong bóng, nhưng thực sự thì không. Từ MSDN:

Mặc dù sự kiện được định tuyến này có vẻ là một sự kiện được định tuyến dọc theo cây phần tử của từng UIElement. Nếu bạn đặt thuộc tính Handled thành true trong trình xử lý sự kiện MouseDoubleClick, các sự kiện MouseDoubleClick tiếp theo dọc theo tuyến đường sẽ xảy ra với Handled được đặt thành false.

Thay vào đó bạn có thể sử dụng các sự kiện MouseLeftButtonDown và kiểm tra clickcount:

private void myCustomControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.ClickCount == 2) 
    { 
     //do something 
     e.Handled = true; 
    } 
} 

Lưu ý: Đây không hoạt động trên MouseLeftButtonUp đối với một số lý do.

+0

Cảm ơn sự giúp đỡ của bạn! Bởi vì tất cả các con của kiểm soát tùy chỉnh của tôi đã có sự kiện gắn với nhấp đúp, tôi đã chọn thay đổi trình xử lý sự kiện cấp cửa sổ thành MouseLeftButtonDown. Nó hoạt động tốt đẹp ngay bây giờ! Cảm ơn một lần nữa! – chelsea

+0

@chelsea Bạn được chào đón! Sự kiện nhấp đúp có thể là một nỗi đau để sử dụng, vì vậy tôi thường xuyên cố gắng tránh nó hoàn toàn. –

+0

Ngoài sự tò mò, có bất kỳ tài liệu nào cho biết lý do sự kiện này không bong bóng như phần còn lại không? Bài viết MSDN không thực sự cung cấp một lời giải thích cho lý do tại sao nó được thực hiện theo cách này. – chelsea

0

Tôi sẽ cố gắng thêm một kiểm tra cho điều khiển tùy chỉnh của bạn trong sự kiện cấp cửa sổ của bạn. Làm một loại kiểm tra trên người gửi nếu nó phù hợp với điều khiển tùy chỉnh của bạn chỉ cần trả lại của nó.

+0

Tôi đã thực sự cố gắng để xem điều gì sẽ xảy ra. Thật không may, loại luôn xuất hiện là cửa sổ ứng dụng, bất kể có nhấp đúp xảy ra trong điều khiển hay không. – chelsea

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