2011-09-14 9 views
5

मेरे पास एक फॉर्म है। डेटा विज़ुअलाइजेशन। चार्टिंग। WindowsFormsHost में चार्ट करें। मैं माउस व्हील घटनाओं को प्राप्त करने के लिए चार्ट नहीं प्राप्त कर सकता। क्लिक काम कर रहे हैं, अगर मैं किसी फॉर्म के साथ प्रयास करता हूं। टेक्स्टबॉक्स माउस व्हील भी काम कर रहा है। माउस व्हील भी काम कर रहा है अगर मैं चार्ट को "देशी" फॉर्म ऐप में उपयोग करता हूं।WindowsFormsHost में WIndows फॉर्म चार्ट माउस व्हील प्राप्त नहीं करता है?

तो, समस्या फॉर्म में चार्ट चार्ट का संयोजन क्या समस्या बनाता है।

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 

    <TextBlock Name="TextBlock1" Grid.Column="1" /> 
    <WindowsFormsHost Name="WindowsFormsHost1" Grid.Column="0"/> 
</Grid> 

और पीछे कोड:

public MainWindow() 
    { 
     InitializeComponent(); 

     var chart = new Chart() { BackColor = System.Drawing.Color.Aquamarine}; 
     WindowsFormsHost1.Child = chart; 

     chart.MouseDown += (a, b) => TextBlock1.Text += "FORMS click\r\n"; 
     TextBlock1.MouseDown += (a, b) => TextBlock1.Text += "WPF click\r\n"; 

     chart.MouseWheel += (a, b) => TextBlock1.Text += "FORMS wheel\r\n"; 
     TextBlock1.MouseWheel += (a, b) => TextBlock1.Text += "WPF wheel\r\n"; 
    } 

मैं सभी क्लिक और WPF से माउस व्हील प्राप्त कर सकते हैं, लेकिन से कोई पहिया

यहाँ समस्या को दोहराने के एक verry आसान एप्लिकेशन है रूपों। मैंने फॉर्म के पहिया श्रोता की भी कोशिश की, बिना सफलता के।

कोई भी विचार? जॉन स्कीट?

उत्तर

2

यह विंडोज फॉर्म (WinForms) और WPF के बीच एक आम इंटरऑपरेबिलिटी समस्या है। डब्ल्यूपीएफ घटनाएं अलग-अलग व्यवहार करती हैं, वे विंडोज फॉर्म के पुराने ईवेंट हैंडलिंग की बजाय रूटेड इवेंट का उपयोग करते हैं।

WinForms ही संदेश Win32 दुनिया से निपटने का एक नक्शा है, इसलिए आप मैन्युअल रूप से यह कोड करने के लिए जब embedding WindowsForms WPF पर नियंत्रित करते हैं। माउस क्लिक के अलावा माउस इवेंट को संभालने के लिए (इसमें माउस व्हील समेत), आपको Winforms ईवेंट को सरोगेट करना होगा।

.NET 4 की

MSDN लाइब्रेरी यह स्पष्ट रूप से उल्लेख किया:

सरोगेट विंडोज फॉर्म्स संदेश लूप

डिफ़ॉल्ट रूप से, System.Windows.Forms.Application वर्ग के लिए प्राथमिक संदेश पाश शामिल विंडोज़ फॉर्म एप्लीकेशन। इंटरऑपरेक्ट के दौरान, विंडोज फॉर्म संदेश लूप संदेश संसाधित नहीं करता है। इसलिए, यह तर्क पुन: उत्पन्न किया जाना चाहिए। घटक डिसपैचर के लिए हैंडलर। थ्रेडफिल्टर मैसेज इवेंट निम्नलिखित चरणों का पालन करता है:

1. IMessageFilter इंटरफ़ेस का उपयोग कर संदेश फ़िल्टर करता है।

2. नियंत्रण .PreProcessMessage विधि को कॉल करता है।

3. यदि आवश्यक हो, तो संदेश भेजता है और संदेश भेजता है।

4.Passes होस्टिंग नियंत्रण करने के लिए संदेश, अगर कोई अन्य नियंत्रण प्रक्रिया संदेश।

जब विंडो हैंडल नष्ट हो जाता है, तो WindowsFormsHost नियंत्रण खुद को पंजीकरण से हटा देता है।

अधिक जानकारी के लिए, पर जाएँ: http://msdn.microsoft.com/en-us/library/ms742474.aspx

+0

अपने स्पष्टीकरण के लिए धन्यवाद, लेकिन है कि मुझे इस मुद्दे solfing में एक बहुत मदद नहीं करता है। मुझे लगता है कि मुझे घटनाओं को मैन्युअल रूप से रूट करने की ज़रूरत है, लेकिन मुझे नहीं पता कि कैसे। मैंने फॉर्म में अपने स्वयं के आदेश भेजने के लिए डब्ल्यूपीएफ में माउस व्हील को पकड़ने की भी कोशिश की, लेकिन मैं डब्ल्यूपीएफ में पहिया को पकड़ने में सक्षम नहीं हूं ...क्या आप कोड स्निपेट या विचारों को वास्तव में समस्या से निपटने के तरीके प्रदान कर सकते हैं? –

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