2010-07-16 25 views
9

Cố gắng để có được sự kiện OnMouse xuất hiện trong một đứa trẻ FrameworkElement. Phần tử gốc là Panel (và thuộc tính Background không phải là Null).WPF FrameworkElement không nhận đầu vào Chuột

class MyFrameworkElement : FrameworkElement 
{ 
    protected override void OnMouseDown(MouseButtonEventArgs e) 
    { 
     // Trying to get here! 
     base.OnMouseDown(e); 
    } 
} 

public class MyPanel : Panel 
{ 
    protected override void OnMouseDown(MouseButtonEventArgs e) 
    { 
     // This is OK 
     base.OnMouseDown(e); 
    } 
} 

OnMouse không bao giờ được gọi là, sự kiện luôn được xử lý và Snoop nói với tôi rằng sự kiện được định tuyến duy nhất dường như để có được như xa như các yếu tố Panel.

<Window 
    x:Class="WpfApplication5.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:l="clr-namespace:WpfApplication5" 
    Title="Window1" Height="300" Width="300"> 
    <Border x:Name="myBorder" Background="Red"> 
    <l:MyPanel x:Name="myPanel" Background="Transparent"> 
     <l:MyFrameworkElement x:Name="myFE"/> 
    </l:MyPanel> 
    </Border> 
</Window> 

Tài liệu nói rằng FrameworkElement xử lý Nhập liệu, nhưng tại sao không có trong trường hợp này?

Trả lời

1

Tôi đã có thể tạo lại kịch bản bạn đã mô tả. Tôi đã làm một số chơi xung quanh, và nó đã không được cho đến khi tôi thay đổi lớp cơ sở của MyFrameworkElement từ FrameworkElement đến một cái gì đó cụ thể hơn, như UserControl rằng các sự kiện bắt đầu bắn như họ cần. Tôi không chắc chắn 100% lý do tại sao điều này sẽ xảy ra, nhưng tôi khuyên bạn nên sử dụng một trong các lớp bắt nguồn từ FrameworkElement phù hợp với nhu cầu của bạn (như Panel, như bạn đã làm trong ví dụ trên hoặc Button).

Tôi tò mò muốn được biết lý do chính xác ví dụ của bạn ở trên tạo ra những kết quả ...

+0

Cảm ơn phản hồi của bạn. Tôi đã được chơi xung quanh một chút và quản lý để có được những hành vi tôi cần bằng cách thêm những điều sau đây vào FrameWorkElement: bảo vệ ghi đè void OnRender (DrawingContext drawingContext) { Kích thước renderSize = this.RenderSize; Chỉnh sửa rect = new Rect (renderSize); Bút bút = bút mới (Brushes.Transparent, 0,0); drawingContext.DrawRectangle (Brushes.Transparent, pen, rect); } Có lẽ FrameworkElement có kích thước bằng không trừ khi có gì đó được thêm vào nó? – lava

20

OnMouseDown sẽ chỉ được gọi là yếu tố nếu bạn đáp ứng Hit Testing. Xem Hit Testing in the Visual Layer. Việc triển khai mặc định sẽ thực hiện thử nghiệm đối chiếu với đồ họa được vẽ trong OnRender. Tạo một Panel với nền Transparent hoạt động vì Panel vẽ hình chữ nhật trên toàn bộ khu vực của nó và hình chữ nhật đó sẽ bắt được thử nghiệm lần truy cập. Bạn có thể nhận được tác dụng tương tự bằng cách ghi đè OnRender để vẽ một hình chữ nhật trong suốt:

protected override void OnRender(DrawingContext drawingContext) 
{ 
    drawingContext.DrawRectangle(Brushes.Transparent, null, 
     new Rect(0, 0, RenderSize.Width, RenderSize.Height)); 
} 

Bạn cũng có thể ghi đè lên HitTestCore để tất cả nhấp chuột được tính là lượt truy cập:

protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters) 
{ 
    return new PointHitTestResult(this, hitTestParameters.HitPoint); 
} 
+0

Cảm ơn bạn đã giải thích tuyệt vời! –

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