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((,如果他们只是暴露了这一点,那就太容易了。