2011-10-14 7 views
12

में कैनवास पर आग नहीं लगाता है मैंने अपना कस्टम चार्ट नियंत्रण किया है और मैं कर्सर के बाद एक साधारण क्रॉस बनाना चाहता हूं। चार्ट को कैनवास पर पॉलीलाइन के रूप में कार्यान्वित किया गया है और मैं कैनवास के OnMouseMove ईवेंट में दो निर्देशों को अपने निर्देशांक बदल रहा हूं।OnMouseMove WPF

आश्चर्य की बात थी पाया है कि घटना केवल प्रत्येक 10 सेकंड या तो घटना जब MainGUI धागा निष्क्रिय है कहा जाता हो (यूआई पूरी तरह से उत्तरदायी है और अगर मैं आवेदन को थामने के मुख्य थ्रेड अनुप्रयोग mainForm.ShowDialog()) पर है।

?।

कैसे क्यों है हो रहा मैं OnMouseMove या PreviewOnMouseMove का उपयोग कर एक ही प्रदर्शन प्राप्त खोजने के लिए पर कोई विचार

संपादित करें: यह मैं कैसे पार पेंट (वैसे भी अगर मैं OnMouseMove केवल उस पर एक ब्रेकपाइंट डाल है समय-समय पर बंद हो जाता है)

एक्सएएमएल:

<Border BorderThickness="1" BorderBrush="White" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" Grid.ColumnSpan="2" > 
    <Canvas x:Name="DrawArea" PreviewMouseMove="DrawArea_PreviewMouseMove" /> 
</Border> 

सीएस:

public Chart() 
{ 
    _line = new Polyline(); 
    _line.Stroke = Brushes.Orange; 
    _crossX = new Line(); 
    _crossY = new Line(); 
    _crossX.Stroke = Brushes.Orange; 
    _crossY.Stroke = Brushes.Orange; 
    _crossX.StrokeThickness = 1; 
    _crossY.StrokeThickness = 1; 

    InitializeComponent(); 

    this.DrawArea.Children.Add(_line); 
    this.DrawArea.Children.Add(_crossX); 
    this.DrawArea.Children.Add(_crossY); 
}  

private void DrawArea_MouseMove(object sender, MouseEventArgs e) 
{ 
    Point mousePosition = System.Windows.Input.Mouse.GetPosition(this.DrawArea); 

    _crossX.X1 = 0; 
    _crossX.X2 = this.DrawArea.ActualWidth; 
    _crossX.Y1 = _crossX.Y2 = mousePosition.Y; 

    _crossY.Y1 = 0; 
    _crossY.Y2 = this.DrawArea.ActualHeight; 
    _crossY.X1 = _crossY.X2 = mousePosition.X; 
} 
+0

क्या आप "नकली" को अतिरिक्त ड्राइंग करने की कोशिश करने के बजाय कस्टम कर्सर को परिभाषित नहीं कर सकते? –

+0

तो, आपके पास कोई प्रदर्शन समस्या नहीं है, लेकिन समस्या यह है कि ईवेंट को बस नहीं कहा जा रहा है - क्या मैं यह सही समझता हूं? –

+0

| डैनियल: इसे कहा जाता है क्योंकि क्रॉस चित्रित किया जाता है लेकिन यह प्रत्येक 10 सेकंड या उससे भी कम समय में 1 बार अपडेट हो जाता है। –

उत्तर

23

यह अजीब है और मुझे पता है क्यों न ... केवल

FrameworkElement.MouseMove काम करता है क्षेत्र कुछ स्पष्ट पृष्ठभूमि ब्रश \ भरने सेट है।

अपने मामले में Canvas.Background="Transparent" सेट करें, इसे काम करना चाहिए।

इस के लिए एक और ठीक है के रूप में अच्छी तरह से ... WPF Not sending MouseMove events after CaptureMouse();

यह संभवतः हो सकता है क्योंकि HitTest रंग का पिक्सल और उनकी प्रतिक्रिया पर निर्भर करता है।

जो भी हो, यह एमएसडीएन पर दस्तावेज नहीं है और कई यूआई डिजाइनरों के लिए भ्रमित है।

+2

मेरे पास सिर्फ दो शब्द हैं: धन्यवाद और डब्ल्यूटीएफ ???? सचमुच अजीब। किसी को माइक्रोसॉफ्ट के अधिकार पर एक दोष भरना चाहिए? –

+2

यदि कैनवास पर कोई बच्चा है, जैसे आकार, टेक्स्टब्लॉक या जो भी हो, उस ऑब्जेक्ट के लिए माउस ईवेंट निकाल दिए जाते हैं और कैनवास (वे प्रत्यक्ष घटनाएं हैं, इसलिए वे बच्चों से बुलबुले से कैनवास तक नहीं पहुंचते हैं) । यह गंभीरता से अजीब है। – Batibix

+2

यह 'ग्रिड' पर भी लागू होता है। – Stefan