使用RoutedEventArgs传递变量?

我有以下类,并希望将文本变量作为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方法中打印“String text”的值。 如何使用RoutedEventArgs args传递“String text”?

最好的祝福!

编辑

我对项目进行了一些更改,这是代码

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个选项卡时应用程序崩溃),您将如何访问Window1类中的CloseTab方法中的“字符串文本”?

创建一个新的RoutedEventArgs子类,向其中添加一个属性,您可以在其中存储要传递的变量,并创建一个类型为void (object, YourNewEventArgs)的相应处理程序委托,然后将其指定为事件的处理程序类型(当前使用的处理程序类型)一个普通的RoutedEventHandler ,因此只提供正常的RoutedEventArgs )。

如果要引发事件,则需要创建新事件args并将变量传递给该变量的属性。 如何在处理程序中获取值应该是不言自明的。

我需要类似的东西,在@Arya和@HB的帮助下,我想出了这个:

我的自定义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; } } 

我的孩子class

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

我的父class

 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