2011-11-13 11 views
6

Ho la seguente classe e voglio passare la variabile di testo come RoutedEventArgs.Passaggio della variabile con 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)); 
    } 
    } 

questo è il codice da Window1 che è la classe principale di un'applicazione 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); 
    } 
    } 

voglio essere in grado di stampare il valore di "text String" nel metodo CloseTab. Come posso far passare "Stringa di testo" con gli oggetti RoutedEventArgs?

I migliori saluti!

EDIT

ho apportato alcune modifiche al progetto e qui è il codice

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); 
    } 
    } 

Dopo aver apportato le modifiche (quando apro più di 1 scheda l'app si arresta in modo anomalo), come si accede al "testo stringa" nel metodo CloseTab nella classe Window1?

+1

Grazie, apprezzo davvero iate questa domanda e le modifiche/aggiunte che avete fatto. – wonea

risposta

10

Creare una nuova sottoclasse di RoutedEventArgs, aggiungere una proprietà in cui è possibile memorizzare la variabile da passare e creare un rispettivo delegato gestore di tipo void (object, YourNewEventArgs) che verrà quindi assegnato come tipo di gestore dell'evento (che attualmente utilizza un normale RoutedEventHandler che fornisce quindi solo normale RoutedEventArgs).

Se l'evento deve essere generato, è necessario creare i nuovi argomenti di evento e passare la variabile alla relativa proprietà per tale variabile. Come ottenere il valore nel gestore dovrebbe essere auto-esplicativo.

+0

@Arya: Il metodo 'CloseTabs' utilizza ancora il generico' RoutedEventArgs' quando dovrebbe avere 'TabsEventArgs', puoi quindi ottenere il testo tramite' args.Text'. Non so perché si blocca, si pubblica il messaggio di eccezione e lo stack-trace se si desidera un aiuto. –

8

Avevo bisogno di qualcosa di simile e con l'aiuto di entrambi @Arya e @ H.B. Sono arrivato fino a questo:

miei RoutedEventArgs personalizzati sottoclasse

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; 
    } 
} 

La mia classe bambino

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); 
} 

mia classe genitore

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; 
} 

Spero che ti aiuta @Arya

Problemi correlati