2010-06-18 9 views
9

में उपयोगकर्ता नियंत्रण से पैरेंट विंडो पर कोई ईवेंट बढ़ाना शीर्षक बहुत अधिक प्रश्न बताता है। जब एप्लिकेशन पहली बार चलाया जाता है तो मेरे पास मुख्य विंडो में लोड किया गया उपयोगकर्ता नियंत्रण होता है। मैं क्या करना चाहता हूं जब उपयोगकर्ता नियंत्रण पर एक बटन क्लिक किया जाता है तो पैरेंट विंडो पर कोई ईवेंट उठाना है, तो मैं उपयोगकर्ता नियंत्रण पर बटन 1_Click से एक मूल ईवेंट कैसे बढ़ा सकता हूं?.NET C#

+0

एक के रूप में FYI करें, मैं एक WPF लिख रहा हूँ: यह ठीक button.click आदि

<Window> .... <uc1:ServerConfigs SettingConfirmed="Window_UserControl_SettingConfirmedEventHandlerMethod" x:Name="ucServerConfigs" ></uc1:ServerConfigs> ... </Window> 

या खिड़की कोड में पीछे, आप आमतौर पर निर्माता में, AddHandler के माध्यम से eventhandler सेट कर सकते हैं की तरह है डेस्कटॉप एप्लिकेशन, इसलिए उपयोगकर्ता नियंत्रण घटना को बुलबुला करने का एक उदाहरण सही होगा। – user246392

उत्तर

2

आप एक RoutedEvent जरूरत link

"कराई घटनाओं की घटनाओं जो ऊपर या दृश्य पेड़ अनुसार नीचे उनके RoutingStrategy पर नेविगेट कर रहे हैं। रूटिंग रणनीति बुलबुला, सुरंग या सीधे हो सकता है। आप पर ईवेंट हैंडलर्स ऊपर हुक कर सकते हैं तत्व जो संलग्न घटना वाक्यविन्यास का उपयोग करके घटना को ऊपर या नीचे अन्य तत्वों पर उठाता है: बटन। क्लिक करें = "बटन_Click"। " ऊपर दिए लिंक पर आपूर्ति की नहीं कैसे परिभाषित करते हैं, को बढ़ाने के लिए की एक पूर्ण विवरण, और एक माता पिता के विंडो पर एक UserControl से एक घटना है पकड़:

29

यह समस्या पूरी तरह नहीं कहा जा करने के लिए एंड-टू-एंड कहीं भी लगता है । यह कुछ के लिए स्पष्ट हो सकता है, लेकिन मुझे बिंदुओं को जोड़ने के लिए एक मिनट लगा, इसलिए मैं अपने निष्कर्ष साझा करूंगा। हां, ऐसा करने का तरीका एक कस्टम रूटेडएवेंट के माध्यम से RoutingStrategy.Bubble पर सेट है, लेकिन कहानी के लिए और भी कुछ है।


इस उदाहरण में, मेरे पास UserControl है, जिसका नाम सर्वरकॉन्फिग है जिसमें एक सहेजें बटन है। जब उपयोगकर्ता सेव बटन पर क्लिक करता है, तो मुझे पैरेंट विंडो पर एक बटन चाहिए, जिसमें UserControl होता है ताकि दूसरे बटन को सक्षम किया जा सके, बटन को btn_synchronize कहा जाता है।

उपरोक्त उद्धृत उपरोक्त रूटेडएवेंट लिंक के अनुसार, निम्नलिखित को परिभाषित करने के बाद उपयोगकर्ता नियंत्रण कोड पर।

public partial class ServerConfigs : UserControl 
{ 

    // Create RoutedEvent 
    // This creates a static property on the UserControl, SettingsConfirmedEvent, which 
    // will be used by the Window, or any control up the Visual Tree, that wants to 
    // handle the event. This is the Custom Routed Event for more info on the 
    // RegisterRoutedEvent method 
    // https://msdn.microsoft.com/en-us/library/ms597876(v=vs.100).aspx 

    public static readonly RoutedEvent SettingConfirmedEvent = 
     EventManager.RegisterRoutedEvent("SettingConfirmedEvent", RoutingStrategy.Bubble, 
     typeof(RoutedEventHandler), typeof(ServerConfigs)); 

    // Create RoutedEventHandler 
    // This adds the Custom Routed Event to the WPF Event System and allows it to be 
    // accessed as a property from within xaml if you so desire 

    public event RoutedEventHandler SettingConfirmed 
    { 
     add { AddHandler(SettingConfirmedEvent, value); } 
     remove { RemoveHandler(SettingConfirmedEvent, value); } 
    } 
    .... 

    // When the Save button on the User Control is clicked, use RaiseEvent to fire the 
    // Custom Routed Event 

    private void btnSave_Click(object sender, RoutedEventArgs e) 
    { 
    .... 
     // Raise the custom routed event, this fires the event from the UserControl 
     RaiseEvent(new RoutedEventArgs(ServerConfigs.SettingConfirmedEvent)); 
    .... 
    } 
} 

कार्यान्वयन उदाहरण के लिए जहां ऊपर ट्यूटोरियल समाप्त होता है। तो कैसे खिड़की पर घटना पकड़ता है और इसे संभालता है?

window.xaml से, इस प्रकार उपयोगकर्ता नियंत्रण में परिभाषित कस्टम रूटेडएवेंट हैंडलर का उपयोग किया जा सकता है।

public Window() 
{ 
    InitializeComponent(); 
    // Register the Bubble Event Handler 
    AddHandler(ServerConfigs.SettingConfirmedEvent, 
     new RoutedEventHandler(Window_UserControl_SettingConfirmedEventHandlerMethod)); 
} 

private void Window_UserControl_SettingConfirmedEventHandlerMethod(object sender, 
       RoutedEventArgs e) 
{ 
    btn_synchronize.IsEnabled = true; 
} 
+2

यह आलेख पढ़ने योग्य है। –

+1

अंत में 'क्लिक' पर रूटेड एवेन्ट्स प्राप्त करने में सक्षम - इस उत्तर में पूरी प्रक्रिया को अंत से अंत तक शामिल किया गया है। उत्तम सामग्री। – nocarrier