自定义用户控件中的事件暴露 - Windows商店应用程序

5

我似乎在Xaml中遇到了暴露事件的问题。我已经像下面这样在自定义用户控件中声明了一个公共事件处理程序。

public sealed partial class FoodItemControl : UserControl
{
    public event EventHandler<StringEventArgs> thumbnailClicked;

    public FoodItemControl()
    {
        InitializeComponent();
        (this.Content as FrameworkElement).DataContext = this;
    }



    private void Thumbnail_Tapped(object sender, TappedRoutedEventArgs e)
    {
        var handler = thumbnailClicked;
        if (handler != null)
        {
            handler(this, new StringEventArgs());
        }
    }
}

但是,当我在XAML中为其分配事件时,暴露的事件处理程序找不到。例如:

<local:FoodItemControl thumbnailClicked="SOMETHING" />

我在找到的示例中是否遗漏了什么?

编辑:看起来我的问题是,我将事件定义为 EventHandler< StringEventArgs >。一旦我更改为简单的 EventHandler,它就可以工作。即

public event EventHandler thumbnailedClicked;

然而,我仍然不太明白为什么?
3个回答

2
您需要创建一个依赖属性并注册该属性,以在用户控件中公开它:
public sealed partial class FoodItemControl : UserControl
{
    public EventHandler thumbnailClicked
    {
        get { return (EventHandler)GetValue(thumbnailClickedProperty); }
        set { SetValue(thumbnailClickedProperty, value); }
    }

    public static readonly DependencyProperty thumbnailClickedProperty =
  DependencyProperty.Register("thumbnailClicked", typeof(EventHandler),
    typeof(FoodItemControl), new PropertyMetadata(""));


    public FoodItemControl()
    {
        this.InitializeComponent();
        (this.Content as FrameworkElement).DataContext = this;
    }
}

1
您也可以使用TypedEventHandler类型:
public event TypedEventHandler<FoodItemControl, StringEventArgs> thumbnailClicked;

这允许您指定自己的事件参数类,该类派生自 EventArgs

0

我从谷歌来到这里,这是唯一与自定义控件中的事件处理程序相关的问题。对我来说,问题的根本原因非常简单,但我花了很长时间才找到它,而你却轻易地忽略了它。

这就是我尝试过的:

public EventHandler<IList<Guid>>? MyCustomEvent;
public EventHandler? MyCustomEvent2;

这是可行的代码:

public event EventHandler<IList<Guid>>? MyCustomEvent;
public event EventHandler? MyCustomEvent2;

我忘记在 EventHandler 前面加上 event。请注意,问号 ? 被使用,因为我在这个 WinUI3 项目中启用了可空特性 (enabled the nullable feature)。现在一切都正常工作了,不需要添加任何复杂的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接