自定义Maui处理程序控件在xaml中使用时会创建处理程序,但在使用c#创建时不会创建处理程序



repo是一个基于maui模板的小示例。我创建了一个名为MyButtonView的按钮,并更改了MainPage以使用该控件。

按钮已创建并正确显示在页面上,但当我尝试仅创建控件时,如var b = new MyButtonView();处理程序没有创建,我不知道如何创建它。

请注意,在源代码中,我已经实现了单击事件,以显示如何不创建处理程序。我确信我错过了什么,但有人能引导我朝着正确的方向走吗?

Github repro

因此,如果创建的控件有一个null处理程序,则需要调用MyButtonView。ToHandler(mauiContext(;听起来很简单,但获取mauiContext有点痛苦。

我能做到这一点的唯一方法是在MauiProgram.cs中做以下操作。这适用于windows,还没有在iOS 中尝试过

var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
})
.ConfigureMauiHandlers(handlers =>
{
handlers.AddHandler<DtNavigationView, DtNavigationViewHandler>();
handlers.AddHandler<DtWindowTabView, DtWindowTabViewHandler>();
handlers.AddHandler<DtWindowTabItem, DtWindowTabItemHandler>();
});
builder.UseMauiEmbedding<Application>();
var mauiapp = builder.Build();
mauiContext = new MauiContext(mauiapp.Services);
return mauiapp;

现在,您可以使用静态上下文将对象获取到处理程序,方法是使用我的按钮视图。ToHandler(MauiProgram.mauiContext(;

不要认为这是最好的方法,但这是我现在能想到的全部。

更新-这不是问题的答案。此时存储MauiContext将导致其他问题,例如无法设置基本导航框架。

因此,到目前为止,我发现的唯一对我有效的方法是捕获MauiContext,即在时将其保存在处理程序中

public override void SetMauiContext(IMauiContext mauiContext) { DtMauiContext.mauiContext = mauiContext; base.SetMauiContext(mauiContext); }

DtMauiContext是一个静态的,我可以在视图级别使用它。

在毛伊岛,他们有申请。现在的FindMauiContext((,如果他们只是暴露了这一点,那就太容易了。

相关内容

最新更新