2011-11-13 17 views
6

次のクラスがあり、テキスト変数を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)); 
    } 
    } 

これは私がCloseTab関数法では「文字列テキスト」の値を出力できるようにしたい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); 
    } 
    } 

でメインクラスですウィンドウ1のコードです。どのようにして "String text"をRoutedEventArgs argsで渡すことができますか?

よろしく!

EDIT

は、私はこのプロジェクトにいくつかの変更を行い、ここで

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コード

ClosableTabItem.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メソッドの "文字列テキスト"にどうやってアクセスしますか?

+1

@Aryaを役に立てば幸いありがとう、本当に感謝します。この質問と、あなたが作った修正/追加を行う。 – wonea

答えて

10

RoutedEventArgsの新しいサブクラスを作成し、渡す変数を格納できるプロパティを追加し、void (object, YourNewEventArgs)の各ハンドラデリゲートを作成します。このハンドラデリゲートは、イベントのハンドラタイプとして割り当てられます。正常なRoutedEventHandlerしかないので、通常はRoutedEventArgsのみを提供する)。

イベントを発生させる場合は、新しいイベントargsを作成し、その変数のプロパティに変数を渡す必要があります。ハンドラの値を取得する方法は、自明である必要があります。

+0

@Arya:あなたの 'CloseTabs'メソッドは、' TabsEventArgs'を持つべきであるときにジェネリック 'RoutedEventArgs'を使います。そうすれば' args.Text'でテキストを取得できます。私はなぜそれがクラッシュするのか分からない、例外メッセージとスタックトレースを投稿してください。 –

8

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

私の子クラス

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

私の親クラス

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

が、それはあなたに

関連する問題