【问题标题】:wpf working with eventswpf 处理事件
【发布时间】:2011-12-05 13:18:14
【问题描述】:

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

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

 public event EventHandler<ThumbnailEventArgs> ThumbnailClick
    {

        add { AddHandler(ThumbnailClickEventRouted, value); }

        remove { RemoveHandler(ThumbnailClickEventRouted, value); }

    }
    public static RoutedEvent ThumbnailClickEventRouted;

让我的public ThumbnailClick 路由但它不起作用。

【问题讨论】:

    标签: wpf events


    【解决方案1】:

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

    主窗口

    <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 文档...

    【讨论】:

    • 感谢您提供明确的解决方案。我忘记了(由于 12 小时工作日 ={)在 XAML 元素中设置它 - 所以有一些错误/
    【解决方案2】:

    编辑:你需要raise the event,也需要read the overview


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

    在 XAML 中:

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

    在各自的*.xaml.cs:

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

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

    如果活动是routed up,你也可以在StackPanel订阅它:

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

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

    【讨论】:

    • 我正在动态添加此控件。我不能写 我有 和所有。并且堆栈面板上没有属性 MyEvent
    • 我正在尝试让我的事件路由,但有些东西不好(
    • @PapaJohn:你读过概述吗?您是否使用相应的方法引发了事件(请参阅编辑)?
    • 我在我的单选按钮中选中它: private void RadioButton_Checked(object sender, RoutedEventArgs e) { if(ThumbnailClick != null) { ThumbnailClick(sender, new ThumbnailEventArgs() { ImageSource = this.Tag作为 ImageSource }); } }
    • @PapaJohn:这不是正确的方法,需要使用方法引发路由事件,再次阅读编辑中的链接。
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2010-12-26
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多