2011-11-13 15 views
6

मेरे पास निम्न श्रेणी है, और टेक्स्ट वैरिएबल को रूटेडएवेंट आर्ट्स के रूप में पास करना चाहते हैं।RoutedEventArgs के साथ चरणीय पास?

public class CloseableTabItem : TabItem 
    { 
    String text; 

    public CloseableTabItem() 
    { 
     //This style is defined in themes\generic.xaml 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CloseableTabItem), 
      new FrameworkPropertyMetadata(typeof(CloseableTabItem))); 
    } 

    public CloseableTabItem(String incomingText) 
    { 
     //This style is defined in themes\generic.xaml 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CloseableTabItem), 
      new FrameworkPropertyMetadata(typeof(CloseableTabItem))); 
     text = incomingText; 
    } 

    public static readonly RoutedEvent CloseTabEvent = 
     EventManager.RegisterRoutedEvent("CloseTab", RoutingStrategy.Bubble, 
      typeof(RoutedEventHandler), typeof(CloseableTabItem)); 

    public event RoutedEventHandler CloseTab 
    { 
     add { AddHandler(CloseTabEvent, value); } 
     remove { RemoveHandler(CloseTabEvent, value); } 
    } 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     Button closeButton = base.GetTemplateChild("PART_Close") as Button; 
     if (closeButton != null) 
     closeButton.Click += new System.Windows.RoutedEventHandler(closeButton_Click); 
    } 

    void closeButton_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 
     this.RaiseEvent(new RoutedEventArgs(CloseTabEvent, this)); 
    } 
    } 

इस Window1 से कोड है जो एक WPF अनुप्रयोग

public partial class Window1 : Window 
    { 
    public static Window1 myWindow1; 

    public Window1() 
    { 
     myWindow1 = this; 
     InitializeComponent(); 
     this.AddHandler(CloseableTabItem.CloseTabEvent, new RoutedEventHandler(this.CloseTab)); 
    } 

    private void CloseTab(object source, RoutedEventArgs args) 
    { 
     TabItem tabItem = args.Source as TabItem; 
     if (tabItem != null) 
     { 
     TabControl tabControl = tabItem.Parent as TabControl; 
     if (tabControl != null) 
      tabControl.Items.Remove(tabItem); 
     } 
    } 

    private void btnAdd_Click(object sender, RoutedEventArgs e) 
    { 
     CloseableTabItem tabItem = new CloseableTabItem("THIS IS A TEST"); 
     MainTab.Items.Add(tabItem); 
    } 
    } 

मैं CloseTab विधि में "स्ट्रिंग पाठ" का मान मुद्रित करने में सक्षम होना चाहता हूँ में मुख्य वर्ग है। मैं RoutedEventArgs args के साथ "स्ट्रिंग टेक्स्ट" कैसे पारित कर सकता हूं?

सर्वश्रेष्ठ सादर!

संपादित

मैं परियोजना में कुछ परिवर्तन किए और यहाँ कोड

ClosableTabItem.cs

namespace SampleTabControl 
{ 
    public class CloseableTabItem : TabItem 
    { 

    String text; 
    public delegate void TabsEventHandler(object sender, TabsEventArgs e); 

    public CloseableTabItem() 
    { 
     //This style is defined in themes\generic.xaml 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CloseableTabItem), 
      new FrameworkPropertyMetadata(typeof(CloseableTabItem))); 
    } 

    public CloseableTabItem(String incomingText) 
    { 
     //This style is defined in themes\generic.xaml 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CloseableTabItem), 
      new FrameworkPropertyMetadata(typeof(CloseableTabItem))); 
     this.text = incomingText; 
    } 

    public static readonly RoutedEvent CloseTabsEvent = EventManager.RegisterRoutedEvent("CloseTab", RoutingStrategy.Bubble, typeof(TabsEventHandler), typeof(CloseableTabItem));  

    public event TabsEventHandler CloseTab 
    { 
     add { AddHandler(CloseTabsEvent, value); } 
     remove { RemoveHandler(CloseTabsEvent, value); } 
    } 


    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     Button closeButton = base.GetTemplateChild("PART_Close") as Button; 
     if (closeButton != null) 
     closeButton.Click += new System.Windows.RoutedEventHandler(closeButton_Click); 
    } 

    void closeButton_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 
     TabsEventArgs args = new TabsEventArgs(CloseTabsEvent, text); 
     RaiseEvent(args); 
    } 
    } 
} 

TabsEventArgs.cs है

public class TabsEventArgs : RoutedEventArgs 
{ 
    private readonly string text; 

    public string Text 
    { 
     get { return text; } 
    } 

    public TabsEventArgs(RoutedEvent routedEvent, string text) : base(routedEvent) 
    { 
     this.text = text; 
    } 
} 

Window1.cs

public partial class Window1 : Window 
    { 
    public static Window1 myWindow1; 

    public Window1() 
    { 
     myWindow1 = this; 
     InitializeComponent(); 
     this.AddHandler(CloseableTabItem.CloseTabsEvent, new RoutedEventHandler(this.CloseTab)); 
    } 

    private void CloseTab(object source, RoutedEventArgs args) 
    {  
     TabItem tabItem = args.Source as TabItem; 
     if (tabItem != null) 
     { 
     TabControl tabControl = tabItem.Parent as TabControl; 
     if (tabControl != null) 
      tabControl.Items.Remove(tabItem); 
     } 
    } 

    private void btnAdd_Click(object sender, RoutedEventArgs e) 
    { 
     CloseableTabItem tabItem = new CloseableTabItem("THIS IS A TEST"); 
     MainTab.Items.Add(tabItem); 
    } 
    } 

परिवर्तन करने के बाद (जब मैं 1 टैब से अधिक टैब खोलता हूं तो ऐप क्रैश हो जाता है), आप विंडो 1 कक्षा में क्लोजटैब विधि में "स्ट्रिंग टेक्स्ट" का उपयोग कैसे करेंगे?

+1

में मदद करता है धन्यवाद, मैं वास्तव में पकड़ लेता हूं इस सवाल को, और आपके द्वारा किए गए संशोधन/जोड़ों को पूरा करें। – wonea

उत्तर

10

RoutedEventArgs का एक नया उपवर्ग बनाएं, जहां चर पारित होने के लिए की दुकान और प्रकार void (object, YourNewEventArgs) की एक संबंधित हैंडलर प्रतिनिधि जिसे फिर आप अपने घटना के हैंडलर प्रकार के रूप में आवंटित बना सकते हैं यह कोई प्रॉपर्टी जोड़ते (जो वर्तमान में एक का उपयोग करता है सामान्य RoutedEventHandler जो इसलिए सामान्य RoutedEventArgs प्रदान करता है)।

यदि घटना को उठाया जाना है तो आपको अपना नया ईवेंट तर्क बनाने और उस चर के लिए चर को अपनी संपत्ति में पास करने की आवश्यकता है। हैंडलर में मूल्य कैसे प्राप्त करें आत्म-स्पष्टीकरण होना चाहिए।

+0

@ आर्य: आपकी 'CloseTabs' विधि अभी भी जेनेरिक' रूटेडएवेंट आर्ट्स 'का उपयोग करती है जब उसके पास' TabsEventArgs' होना चाहिए, तो आप 'args.Text' के माध्यम से टेक्स्ट प्राप्त कर सकते हैं। मुझे नहीं पता कि यह क्यों दुर्घटनाग्रस्त हो जाएगा, अगर आप इसके साथ मदद चाहते हैं तो अपवाद संदेश और स्टैक-ट्रेस पोस्ट करें। –

8

मुझे कुछ समान और @Arya और @ H.B की मदद से कुछ चाहिए। मैं इस के साथ आया था:

मेरे कस्टम RoutedEventArgs उपवर्ग

public class ChangePageEventArgs : RoutedEventArgs { 
    private readonly int _pageNumber; 

    public int PageNumber { 
     get { return _pageNumber; } 
    } 

    public ChangePageEventArgs(RoutedEvent routedEvent, int pageNumber) : base(routedEvent) { 
     this._pageNumber = pageNumber; 
    } 
} 

मेरे बच्चे कक्षा

private void defineButton_Click(object sender, RoutedEventArgs e) { 
    ChangePageItemList(2); 
} 

public static readonly RoutedEvent GoToItemPropertiesViewEvent = EventManager.RegisterRoutedEvent(
"GoToItemPropertiesView", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(NoObjectView)); 

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

public void ChangePageItemList(int _pageNumber) { 
    ChangePageEventArgs args = new ChangePageEventArgs(GoToItemPropertiesViewEvent, _pageNumber); 
    this.RaiseEvent(args); 
} 

मेरे माता पिता वर्ग

private ItemListView createItemListView() { 
    _itemListView = new ItemListView(); 
    _itemListView.GoToItemPropertiesView += new RoutedEventHandler(ChangePage); 

    return _itemListView; 
} 

private void ChangePage(object sender, RoutedEventArgs e) { 
    ChangePageEventArgs args = (ChangePageEventArgs)e; 
    // Value of page number is 2 
    int _pageNumber = args.PageNumber; 
} 

आशा है कि यह आप @Arya

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