2012-11-20 15 views
5

मुझे बुलबुले समझाते हुए बहुत सी उदाहरण मिली लेकिन टनेलिंग के बारे में कोई भी नहीं, जैसे कि बच्चे को माता-पिता। मुझे लगता है कि मेरी मुख्य समस्या यह है कि मुझे समझ में नहीं आता कि बच्चे में रूटेड घटना को कैसे पंजीकृत किया जाए (विंडोकंट्रोल टू यूजर कंट्रोल)। मुझे मिल गया:रूटेड इवेंट टनल बच्चे तक नहीं पहुंचता

public partial class MyParent : UserControl 
{ 
    public static readonly RoutedEvent RoutedMouseUpEvent = EventManager.RegisterRoutedEvent(
     "PreviewMouseLeftButtonUp", RoutingStrategy.Tunnel, typeof(RoutedEventHandler), typeof(WindowControl)); 

// Provide CLR accessors for the event   
public event RoutedEventHandler MouseUp 
{ 
    add { AddHandler(RoutedMouseUpEvent, value); } 
    remove { RemoveHandler(RoutedMouseUpEvent, value); } 
} 

public addView(UserControl view) 
{ 
WindowControl win = new WindowControl(); 
win.Content = view; 
} 

private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    RoutedEventArgs newEventArgs = new RoutedEventArgs(MyParent.RoutedMouseUpEvent); 
      RaiseEvent(newEventArgs); 
} 
} 

addView की कैप्सूलीकरण आवश्यक है, कोई समस्या नहीं होनी चाहिए? बच्चा addView के माध्यम से जोड़ा जाता है। Grid_MouseLeftButtonUp को बुलाया जाता है। XAML

<Grid> 
    <Border BorderBrush="black" BorderThickness="1" HorizontalAlignment="Center" VerticalAlignment="Center" PreviewMouseLeftButtonUp="UserControl_PreviewMouseLeftButtonUp"> 
</Border> 
</Grid> 

में

public partial class ChildView : UserControl 
{ 
void UserControl_PreviewMouseLeftButtonUp(object sender, RoutedEventArgs args) 
{ 
    int i = 0; // The breakpoint is never called 
} 
} 

अगर मैं कुछ तो कृपया मुझे पता है भूल गया:
रिसीवर (इसलिए वहाँ ज्यादा नहीं है यह MVVM है) इस तरह दिखता है। समस्या यह है कि रूटेड घटना UserControl_PreviewMouseLeftButtonUp

उत्तर

11

तक नहीं पहुंचती है यह नहीं है कि सुरंग रूटिंग रणनीति कैसे काम करती है। टनलिंग का मतलब है कि घटना रूट से शुरू होगी और कॉलिंग नियंत्रण के पेड़ पथ पर जायेगी। उदाहरण के लिए हम निम्नलिखित दृश्य पेड़

Window 
| 
|--> SomeUserControl 
|--> MyParent 
    | 
    |--> ChildView 

फिर अगर MyParent एक सुरंग घटना को बढ़ा देंगे है, सुरंग घटना का दौरा करेंगे:

  1. विंडो
  2. MyParent

और

  1. MyParent
  2. ChildView

तो संक्षेप में प्रस्तुत करने, बुदबुदाती घटनाओं हमेशा नियंत्रण में शुरू घटना को ऊपर उठाने होंगे और, दृश्य पेड़ की जड़ में बंद है, जबकि सुरंग घटनाओं दृश्य की जड़ में शुरू होगा घटना को बढ़ाने के नियंत्रण में पेड़ और अंत (सटीक उसी पथ, केवल रिवर्स ऑर्डर)।

संपादित करें: आप MSDN's Routed Events Overview में रूटेड घटनाओं के बारे में अधिक पढ़ सकते हैं।

enter image description here

+0

मुझे समझ नहीं आता: यह भी इस प्रदर्शन एक अच्छा छवि है। मैं प्रोग्राम को क्यों नहीं बता सकता कि MyParent रूट है? – Martin

+1

अब मैं समझता हूं। टनलिंग मेरे बच्चे तक नहीं पहुंच सकती है, जो मेरी राय में काफी बेकार है। मैंने उन डॉक्स को पढ़ा लेकिन किसी भी तरह से इसे इस तरह समझ में नहीं आया। मैं इंटरफेस का उपयोग करके अपनी समस्या का समाधान करूंगा और बस डेटा पास कर रहा हूं (यह योजना बी थी)। उत्कृष्ट व्याख्या के लिए धन्यवाद। – Martin

+1

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

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