2011-11-13 7 views
6

Tengo la siguiente clase, y quiero pasar la variable de texto como RoutedEventArgs.¿Pasar la variable 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)); 
    } 
    } 

este es el código de Window1 que es la clase principal en una aplicación 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); 
    } 
    } 

Quiero ser capaz de imprimir el valor de la "cadena de texto" en el método CloseTab. ¿Cómo puedo hacer que se pase el "Texto de cadena" con los argumentos de RoutedEventArgs?

¡Atentamente!

EDITAR

he hecho algunos cambios en el proyecto y aquí está el código

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

Después de hacer los cambios (al abrir más de 1 pestaña la aplicación se bloquea), ¿cómo acceder a la "cadena de texto" en el método CloseTab en clase Window1?

+1

Gracias, realmente aprecio Haga esta pregunta y las modificaciones/adiciones que haya realizado. – wonea

Respuesta

10

Crea una nueva subclase de RoutedEventArgs, agrega una propiedad donde puedes almacenar la variable que se va a pasar y crea un delegado controlador respectivo del tipo void (object, YourNewEventArgs) que luego asignas como el tipo de controlador de tu evento (que actualmente usa un normal RoutedEventHandler que por lo tanto solo proporciona normal RoutedEventArgs).

Si el evento se va a elevar entonces necesita crear sus nuevos argumentos de eventos y pasar la variable a su propiedad para esa variable. Cómo obtener el valor en el controlador debe ser autoexplicativo.

+0

@Arya: su método 'CloseTabs' todavía usa el' RoutedEventArgs' genérico cuando debería tener 'TabsEventArgs', luego puede obtener el texto mediante' args.Text'. No sé por qué se bloqueará, publica el mensaje de excepción y el seguimiento de la pila si quieres ayuda con eso. –

8

Necesitaba algo similar y con la ayuda de @Arya y @ H.B. Se me ocurrió esto:

Mis RoutedEventArgs personalizados subclase

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

Mi clase hija

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

Mi clase padre

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

espero que le ayuda a @Arya

Cuestiones relacionadas