wpf处理事件

时间:2011-12-05 13:18:14

标签: wpf events

我用一些按钮和事件编写了我自己的控件 - 这就像一个魅力。然后我动态地将这些控件作为一个孩子放在StackPanel的其他类中。我怎么能在这个班级(StackPanel)从我的自定义控件中获取事件 - 我的用户控件中有一个公共事件 - 我怎样才能从StackPanel类处理它?<​​/ p>

我正在尝试写一些类似的东西:

 public event EventHandler<ThumbnailEventArgs> ThumbnailClick
    {

        add { AddHandler(ThumbnailClickEventRouted, value); }

        remove { RemoveHandler(ThumbnailClickEventRouted, value); }

    }
    public static RoutedEvent ThumbnailClickEventRouted;

public ThumbnailClick路由,但无效。

2 个答案:

答案 0 :(得分:0)

修改:您需要raise the eventread the overview


如果您的活动是公开的,您应该可以从几乎任何地方订阅它:

在XAML中:

<StackPanel>
    <local:MyControl MyEvent="MyControl_OnMyEvent"/>

在相应的*.xaml.cs

private void MyControl_OnMyEvent(object sender, EventArgs e)
{
     //Handler logic here
}

根据需要更改参数的类型。

如果活动为routed,您还可以在StackPanel上订阅:

<StackPanel local:MyControl.MyEvent="MyControl_OnMyEvent">

这使您可以在一个地方处理所有MyControl个孩子的事件,而无需为每个实例添加处理程序。

答案 1 :(得分:0)

您的路由事件应该冒出来,所以只需在堆叠面板上捕获它。确保在注册路由事件时选择RoutingStrategy.Bubble

MainWiindow

<StackPanel local:UserControl1.Tap="Grid_Tap" >
    <local:UserControl1 Width="120"></local:UserControl1>
</StackPanel>

用户控制

<Grid>
    <Button Click="Button_Click">Tap Me</Button>
</Grid>

背后的用户控制代码

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    // Create a custom routed event by first registering a RoutedEventID
    // This event uses the bubbling routing strategy
    public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
        "Tap", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(UserControl1));

    // Provide CLR accessors for the event
    public event RoutedEventHandler Tap
    {
        add { AddHandler(TapEvent, value); }
        remove { RemoveHandler(TapEvent, value); }
    }

    // This method raises the Tap event
    void RaiseTapEvent()
    {
        RoutedEventArgs newEventArgs = new RoutedEventArgs(UserControl1.TapEvent);
        RaiseEvent(newEventArgs);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        RaiseTapEvent();
    }
}

UserControl1中的一些代码是从Microsoft docutments ...

处理的