XAML 在WinUI 3中向CustomControl添加自定义事件

qcuzuvrc  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(143)

我在WinUI 3中创建了一个具有一些自定义属性的CustomControlDependencyProperty)。
现在,我还想添加一个自定义的Event(不确定它是否必须是RoutedEvent?),只要控件的CurrentStatus属性发生更改,它就必须触发。我希望能够像管理简单Button的Click一样管理它,因此类似于:
第一个
我应该如何在MyCustomTextBlock控件的代码背后声明Event和EventHandler?
我是WinUI 3和XAML的新手,正在查找"* winui 3自定义事件 *"。我找到了this,但它与WPF相关,因此我找不到WinUI Microsoft.UI.Xaml库中引用的EventManager.RegisterRoutedEvent()

更新日期:2022年9月13日

我按照@AndrewKeepCoding的建议,现在这是我在MainWindow页面上放置MyCustomTextBlock控件的代码。
第一个
没有警告或编译错误,但现在每次我在调试模式下启动应用程序时,它都会崩溃,而不会捕获任何特定的异常,错误描述如下:
[10584] WinUI3TestApp.exe中出现Win32非托管异常

调用MainWindow.InitializeComponent()方法没有任何问题,但在传递public MyCustomTextBlock()构造函数方法的最后一行后,我不知道发生了什么,但一些东西使应用程序崩溃。

更新日期:2022年9月14日

它似乎与这个Microsoft.UI.XamlIssue有关。可能是异步方法内部的某个地方出错了,但由于这个bug,不可能捕获异常。

    • 解决方法**

我的问题与XAML(StatusChanged="MessageBlock_StatusChanged")中添加的事件处理程序方法有关。
将其删除并在MyCustomTextBlock.Loaded()方法的代码隐藏中替换为事件处理程序声明(MessageBlock.StatusChanged += MessageBlock_StatusChanged;)后,一切都正常工作。

cgyqldqp

cgyqldqp1#

您可以像这样实现一个自定义的EventHandler

public class StatusChangedEventArgs : EventArgs
{
    public Status OldValue { get; }
    public Status NewValue { get; }

    public StatusChangedEventArgs(Status oldValue, Status newValue)
    {
        OldValue = oldValue;
        NewValue = newValue;
    }
}

public sealed class MyCustomTextBlock : Control
{
    public enum Status
    { 
        Waiting,
        Busy,
    }
    
    private Status currentStatus;
    public Status CurrentStatus
    {
        get { return currentStatus; }
    }

    public MyCustomTextBlock()
    {
        this.DefaultStyleKey = typeof(MyCustomTextBlock);
        currentStatus = Status.Waiting;
    }

    public event EventHandler<StatusChangedEventArgs>? StatusChanged;

    protected void OnStatusChanged(Status oldValue, Status newValue)
    {
        StatusChanged?.Invoke(this, new StatusChangedEventArgs(oldValue, newValue));
    }
}

相关问题