2011-11-13 15 views
6

Mam następujące klasy i chcę przekazać zmienną tekstową jako RoutedEventArgs.Przekazywanie zmiennej z 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)); 
    } 
    } 

jest to kod z oknie Window1 która jest główną klasą w aplikacji 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); 
    } 
    } 

Chcę móc wydrukować wartość „text string” w metodzie CloseTab. Jak mogę przekazać "tekst ciągu" za pomocą argumentów RoutedEventArgs?

Pozdrawiamy!

EDIT

Zrobiłem kilka zmian w projekcie i Oto kod

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

Po wprowadzeniu zmian (gdy otworzę więcej niż 1 kartę awarii aplikacji), w jaki sposób uzyskasz dostęp do "tekstu ciągu" w metodzie CloseTab w klasie Window1?

+1

Dzięki, naprawdę doceniam na to pytanie i poprawki/dodatki, które wprowadziłeś. – wonea

Odpowiedz

10

Utwórz nową podklasę RoutedEventArgs, dodać obiekt do tego, gdzie można przechowywać zmienne mają być przekazywane i stworzyć odpowiednią delegata uchwytu typu void (object, YourNewEventArgs) które następnie przypisać jako rodzaj procedury obsługi tego wydarzenia (które obecnie wykorzystuje normalny RoutedEventHandler, który zapewnia tylko normalny RoutedEventArgs).

Jeśli zdarzenie ma zostać podniesione, należy utworzyć nowe arg zdarzenia i przekazać zmienną do jej właściwości dla tej zmiennej. Jak uzyskać wartość w procedurze obsługi powinno być zrozumiałe.

+0

@Arya: Twoja metoda 'CloseTabs' nadal używa generycznego' RoutedEventArgs', kiedy powinna mieć 'TabsEventArgs', możesz wtedy uzyskać tekst poprzez' args.Text'. Nie wiem, dlaczego spowodowałoby to awarię, publikujesz komunikat wyjątku i ślad stosu, jeśli potrzebujesz pomocy. –

8

Potrzebowałem czegoś podobnego i przy pomocy zarówno @Arya, jak i @HB. Wpadłem na to:

Moje niestandardowe RoutedEventArgs podklasa

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

Moja klasa dziecko

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

Moja klasa dominująca

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

Nadzieja to pomaga @Arya

Powiązane problemy