2012-04-27 13 views
0

我有一個包含ListBox的用戶控件。如何使用我自己的事件包裝標準wpf事件?

我想暴露一個SelectionChanged事件對我的用戶控件包裝listBox.SelectionChanged事件。

所以,當列表框項目選擇的變化,對用戶控制自己的自定義事件也被之後所觸發的......

我會怎麼做呢? 任何樣品將不勝感激。 謝謝!

回答

1

我不確定包裝是最好的方法,即使你可以包裝它。我建議只定義你自己的事件,並在鉤住listBox.SelectionChanged的處理程序中激發你自己的事件。然後,您可以將原始列表框事件中的任何數據傳遞給您自己的事件。

添加樣品:

public partial class MainWindow : Window 
{ 
    public delegate void CustomSelectionChangedEventHandler(object sender, SelectionChangedEventArgs e); 
    public event CustomSelectionChangedEventHandler CustomSelectionChanged; 


    public MainWindow() 
    { 
     InitializeComponent(); 
     listBox1.SelectionChanged += delegate(object sender, SelectionChangedEventArgs e) 
     { 
      OnCustomSelectionChanged(e); 
     }; 

    } 

    void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     OnCustomSelectionChanged(e); 
    } 

    //We'll use the system defined SelectionChangedEventArgs type instead of creating a derived EventArgs class 
    protected virtual void OnCustomSelectionChanged(SelectionChangedEventArgs e) 
    { 
     if (CustomSelectionChanged != null) 
      CustomSelectionChanged(this, e); 

    } 
} 

進一步閱讀:

1

如果您希望您的UserControl上的自定義事件觸發可視化樹,則應將其公開爲RoutedEvent。在.xaml.cs文件中,您需要將事件註冊爲路由事件,然後實現自定義處理程序和事件參數類。

XAML:

<UserControl x:Class="WpfApplication1.MyUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <ListView Name="myListView" SelectionChanged="OnSelectionChanged_"/> 
    </Grid> 
</UserControl> 

代碼:

public partial class MyUserControl : UserControl 
{ 
    public delegate void CustomSelectionChangedEventHandler(object sender, SelectionChangedRoutedEventArgs args); 


    public static readonly RoutedEvent CustomSelectionChangedEvent = EventManager.RegisterRoutedEvent(
     "CustomSelectionChanged", RoutingStrategy.Bubble, typeof(CustomSelectionChangedEventHandler), typeof(MyUserControl)); 


    public event RoutedEventHandler CustomSelectionChanged 
    { 
     add { AddHandler(CustomSelectionChangedEvent, value); } 
     remove { RemoveHandler(CustomSelectionChangedEvent, value); } 
    } 


    public MyUserControl() 
    { 
     InitializeComponent(); 
    } 


    private void OnSelectionChanged_(object sender, SelectionChangedEventArgs e) 
    { 
     RaiseEvent(new SelectionChangedRoutedEventArgs(myListView, CustomSelectionChangedEvent, e.AddedItems, e.RemovedItems)); 
    } 
} 


public class SelectionChangedRoutedEventArgs : RoutedEventArgs 
{ 
    public IList AddedItems { get; set; } 
    public IList RemovedItems { get; set; } 

    public SelectionChangedRoutedEventArgs(object source, RoutedEvent routedEvent, IList addedItems, IList removedItems) 
     : base(routedEvent, source) 
    { 
     AddedItems = addedItems; 
     RemovedItems = removedItems; 
    } 
} 

控件的調用者隨後將提供與簽名的CustomSelectionChanged事件的事件處理程序:

private void OnCustomSelectionChanged(object sender, SelectionChangedRoutedEventArgs e) { } 
相關問題