2010-07-16 14 views
9

बच्चे को FrameworkElement में ऑन-हाउस ईवेंट दिखाई देने का प्रयास कर रहा है। मूल तत्व Panel है (और Background संपत्ति शून्य नहीं है)।WPF FrameworkElement माउस इनपुट प्राप्त नहीं कर रहा

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 कहा जाता हो जाता है कभी नहीं, घटना हमेशा बिना क्रिया है और स्नूप मुझसे कहता है कि कराई घटना ही कभी जहाँ तक 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> 

डॉक्स का कहना है कि FrameworkElement इनपुट को संभालता है, लेकिन इस परिदृश्य में क्यों नहीं?

उत्तर

1

मैं आपके द्वारा वर्णित परिदृश्य को पुन: पेश करने में सक्षम था। मैंने कुछ लोगों के आसपास खेलना शुरू किया, और जब तक मैंने से की बेस क्लास को UserControl जैसे कुछ ठोस बनाने के लिए बदल दिया, तब तक घटनाओं को फायरिंग शुरू कर दिया गया था। मुझे 100% यकीन नहीं है कि यह क्यों होगा, लेकिन मैं FrameworkElement से व्युत्पन्न कक्षाओं में से एक का उपयोग करने की अनुशंसा करता हूं जो आपकी आवश्यकताओं के अनुरूप होगा (जैसे Panel, जैसा कि आपने ऊपर दिए गए उदाहरण में किया है, या Button)।

मैं ... सही कारण अपने उदाहरण से ऊपर इन परिणामों का उत्पादन जानने के लिए उत्सुक हो जाएगा

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मैं थोड़ी देर के लिए खेल रहा हूं और फ्रेमवर्क कार्य में निम्नलिखित जोड़कर मुझे जिस व्यवहार की आवश्यकता है, उसे प्राप्त करने में कामयाब रहा: संरक्षित ओवरराइड शून्य ओवररेंडर (ड्रॉइंग कॉन्टेक्स्ट ड्राइंग कॉन्टेक्स्ट) { आकार रेंडर आकार = यह। रेंडर आकार; रेक्ट रेक्ट = नया रेक्ट (रेंडरसाइज); पेन पेन = नया पेन (ब्रश। ट्रांसपेरेंट, 0.0); drawingContext.DrawRectangle (ब्रश। ट्रांसपेरेंट, पेन, रेक्ट); } शायद फ्रेमवर्क एलिमेंट आकार में शून्य है जब तक इसमें कुछ जोड़ा नहीं जाता है? – lava

20

OnMouseDown केवल अपने तत्व परीक्षण मारो का जवाब है, तो कहा जाएगा। Hit Testing in the Visual Layer देखें। डिफ़ॉल्ट कार्यान्वयन OnRender में खींचे गए ग्राफिक्स के खिलाफ हिट परीक्षण करेगा। Panel को Transparent पृष्ठभूमि कार्यों के साथ बनाना क्योंकि Panel अपने पूरे क्षेत्र में एक आयताकार खींचता है, और आयताकार हिट टेस्ट को पकड़ लेगा। आप OnRender अधिभावी एक पारदर्शी आयत बनाने के लिए द्वारा एक ही प्रभाव प्राप्त कर सकते हैं:

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

तुम भी HitTestCore इसलिए रद्द कर सकते थे कि उन सभी क्लिक्स हिट के रूप में गिने जाते हैं:

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

एक उत्कृष्ट स्पष्टीकरण के लिए धन्यवाद! –

संबंधित मुद्दे