Passing a variable using RoutedEventArgs?

I have the following class and want to pass a text variable as 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)); } } 

this is the code from Window1, which is the main class in a WPF application.

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

I want to be able to print the value "String Text" in the CloseTab method. How can I pass "String text" with arguments to RoutedEventArgs?

Best wishes!

EDIT

I made some changes to the project, and here is the code

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

After making changes (when you open more than one tab, the application is disabled), how do you get access to the "text text" of the CloseTab method in the Window1 class?

+9
source share
3 answers

Create a new subclass of RoutedEventArgs , add a property to it in which you can save the passed variable and create an appropriate delegate handler of type void (object, YourNewEventArgs) , which you then assign as the type of handler for your event (which currently uses the usual RoutedEventHandler , which therefore provides only normal RoutedEventArgs ).

If an event is to be raised, you need to create your new event arguments and pass the variable to its property for that variable. How to get the value in the handler should be clear.

+10
source
I need something similar and with @Arya and @HB I came up with this:

My custom subclass of 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; } } 

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

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

Hope this helps you @Arya

+9
source

1 - create a new event data class:

 public class SelectedRowEventArgs : RoutedEventArgs { public int Value { get; set; } public SelectedRowEventArgs(RoutedEvent routedEvent, int value) : base(routedEvent) { this.Value = value; } } 

2 - create a link code in a user control:

 public partial class AusenciasBaseAdmin : UserControl { public static readonly RoutedEvent RowChangedEvent = EventManager.RegisterRoutedEvent("RowChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AusenciasBaseAdmin)); public event RoutedEventHandler RowChanged { add { AddHandler(RowChangedEvent, value); } remove { RemoveHandler(RowChangedEvent, value); } } public AusenciasBaseAdmin() { InitializeComponent(); } private void RegAusencias_SelectionChanged(object sender, SelectionChangedEventArgs e) { this.RaiseEvent(new SelectedRowEventArgs(RowChangedEvent, 1)); } } 

3 - link of the user control in the main form:

 <control:AusenciasBaseAdmin Grid.Row="0" Grid.Column="0" x:Name="GridAusencias" RowChanged="GridAusencias_RowChanged_1" /> 

4 - for the code in the main form:

  private void GridAusencias_RowChanged_1(object sender, RoutedEventArgs e) { SelectedRowEventArgs t = (SelectedRowEventArgs)e; MessageBox.Show(t.Value.ToString()); } 

GREETINGS FOR THE WPF TEAM. YOU REACHED TO MAKE IT EXTREMELY DIFFICULT

0
source

Source: https://habr.com/ru/post/901367/


All Articles