wpf处理事件

wpf处理事件,wpf,events,Wpf,Events,我用一些按钮和事件编写了我自己的控件,这就像一个符咒。然后,我将此控件作为子控件动态放置在另一个类的StackPanel中。在这个类中(使用StackPanel)如何从自定义控件获取事件-我的用户控件中有一个公共事件-如何从StackPanel类处理它 我试着写一些东西,比如: public event EventHandler<ThumbnailEventArgs> ThumbnailClick { add { AddHandler(ThumbnailC

我用一些按钮和事件编写了我自己的控件,这就像一个符咒。然后,我将此控件作为子控件动态放置在另一个类的
StackPanel
中。在这个类中(使用
StackPanel
)如何从自定义控件获取事件-我的用户控件中有一个公共事件-如何从
StackPanel
类处理它

我试着写一些东西,比如:

 public event EventHandler<ThumbnailEventArgs> ThumbnailClick
    {

        add { AddHandler(ThumbnailClickEventRouted, value); }

        remove { RemoveHandler(ThumbnailClickEventRouted, value); }

    }
    public static RoutedEvent ThumbnailClickEventRouted;
公共事件事件处理程序缩略图单击
{
添加{AddHandler(ThumbnailClickEventRouted,value);}
移除{RemoveHandler(ThumbnailClickEventRouted,值);}
}
公共静态路由事件缩略图ClickEventRouted;

若要使我的
公用缩略图,请单击“路由”,但它不工作。

编辑:您也需要这样做


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

在XAML中:

<StackPanel>
    <local:MyControl MyEvent="MyControl_OnMyEvent"/>
根据需要更改参数的类型

如果事件已启动,您也可以在
StackPanel
上订阅它:

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

这允许您在一个位置处理所有MyControl子对象的事件,而无需将处理程序添加到每个实例。

您的routed事件应该会出现气泡,因此只需在stackpanel中捕捉它即可。请确保在注册路由事件时选择RoutingStrategy.Bubble

缅因州

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

UserControl1中的一些代码来自Microsoft文档…

我正在以友好方式添加此控件。我写不出我所拥有的一切。StackPanel上没有MyEvent属性我正在尝试路由我的事件,但有些不好(@PapaJohn:您阅读了概述吗?您是否使用相应的方法引发了事件(请参见编辑)?我正在我的单选按钮选中:private void单选按钮选中(对象发送方,RoutedEventArgs e){if(ThumbnailClick!=null){ThumbnailClick(sender,new ThumbnailEventArgs(){ImageSource=this.tagas ImageSource});}@PapaJohn:这不是正确的方法,路由事件需要使用方法引发,再次阅读编辑中的链接。感谢您提供清晰的解决方案。我忘记了(由于12小时工作日={)在XAML元素中设置它-因此出现了一些错误/
<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();
    }
}