我在 MAUI 中遇到了一个错误,我只是想知道我是否是唯一的一个,或者我在这个新环境中是否做错了什么:)
之前我总是能够在通过单击按钮导航到新页面时执行此操作:
private async void OnButtonClicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new Page1());
}
Run Code Online (Sandbox Code Playgroud)
但它似乎不再起作用了,这就是我的 Page1 在 C# 代码中的样子:
public partial class Page1 : ContentPage
{
public Page1()
{
InitializeComponent();
}
protected override async void OnAppearing()
{
base.OnAppearing();
await MainThread.InvokeOnMainThreadAsync(async () => { await LoadRecipes(); });
}
private async Task LoadRecipes()
{
//no code yet
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码并单击按钮时,没有任何反应。
我有一个非常简单的 .NET MAUI 应用程序(不是 Blazor 应用程序)。我已经安装了 Seriolog 和 Serilog.Extensions.Logging (这样我就可以使用 AppCenter)。我的启动代码中有以下内容来初始化 Serilog
public static MauiApp CreateMauiApp()
{
// set up logging
var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
path = Path.Combine(path, "debugcode.txt");
Log.Logger = new LoggerConfiguration()
//.MinimumLevel.Debug()
.WriteTo.File(path)
.WriteTo.AppCenterCrashes(restrictedToMinimumLevel: LogEventLevel.Information)
.WriteTo.Console()
.CreateLogger();
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
})
.Logging.AddSerilog(Log.Logger);
return builder.Build();
}
Run Code Online (Sandbox Code Playgroud)
这编译没有问题。我已将日志记录代码添加到 main.xaml.cs 中(该代码只是 VisualStudio 附带的默认 .NET MAUI 测试应用程序)。最小调试行已被注释掉,但如果不注释掉也没有什么区别。
protected override void OnDisappearing()
{
base.OnDisappearing();
Log.CloseAndFlush();
}
void OnCounterClicked(object sender, EventArgs e)
{
count++; …Run Code Online (Sandbox Code Playgroud) 我在 .Net Maui 有一个开关控件:
<Switch IsToggled="true" Grid.Row="3" Grid.Column="1" VerticalOptions="Center"/>
Run Code Online (Sandbox Code Playgroud)
默认情况下,它根据其状态显示“开/关”标签。我希望它什么也不显示。
有什么方法可以隐藏/删除它吗?
我们有一个针对每个平台构建的 C++ 库,即适用于 Windows 的 .dll、适用于 Android 的 .so 以及适用于 iOS 的 .a。尝试以下方法将 .so 文件包含在 Android 版 MAUI 应用程序中。(其他平台待定)-
Platforms -> Android -> lib -> arm64-v8a文件夹Build Action = AndroidNativeLibraryJavaSystem.LoadLibrary(lib name);但是,代码失败了
UnsatisfiedLinkError异常:dlopen失败:在Java.Interop.JniEnvironment.StaticMethods.CallStaticVoidMethod(JniObjectReference类型,JniMethodInfo方法,JniArgumentValue * args)中找不到库“lib name.so”在Java.Interop.JniEnvironment.StaticMethods.CallStaticVoidMethod(JniObjectReference类型) 、JniMethodInfo 方法、JniArgumentValue* args) 在 /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/Java.Interop/JniEnvironment.g.cs:line 13250 at Java /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers 中的.Interop.JniPeerMembers.JniStaticMethods.InvokeVoidMethod(字符串编码成员,JniArgumentValue* 参数)。 JniStaticMethods.cs:第 41 行位于 /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net6.0/android- 中的 Java.Lang.JavaSystem.LoadLibrary(String libname) 31/mcw/Java.Lang.JavaSystem.cs:第339行
在 VS 输出窗口中,可以看到以下消息 -
“共享库‘库名称’未加载,p/invoke‘方法名称’可能会失败”
尝试移动 lib 目录,但没有成功。
我们在这里缺少什么?
还有使用现有 C++ 库的 MAUI 示例吗?支持真的足以满足生产使用吗?
--- 更新 …
似乎是一个简单的问题,但我一直无法找到简单的答案。本质上,我想根据某些存储的状态选择应用程序中的哪个页面启动。我在 AppShell 构造函数中添加了 GoToAsync 调用,但这不起作用 - 这是有道理的,因为 AppShell 尚未完全构建。
我找到了这个答案,但感觉它有点回避这个问题:
哪里是注入一些代码的最佳位置,这些代码将在启动时运行一次并可以成功地将 .NET Maui 应用程序导航到所选页面?
我观看了有关如何创建 .NET MAUI Blazor 应用程序的教程
https://www.youtube.com/watch?v=bnoCU5XGBh4
但是,我有一个现有的 Blazor Web Assembly 应用程序,将其包装到 BlazorWebView 中的最佳推荐方法是什么?我已经四处寻找教程,但由于它相当新,所以内容不多。
我正在尝试将 iOS 平台特定的代码添加到我的 .NET MAUI 应用程序中。
我的目标是 iPhone net6.0-ios:
但是,Visual Studio 认为我的目标是 Android:
编译和运行应用程序工作正常(iOS 预处理器指令中的断点被击中),但是必须在条件预处理器指令之外实现特定于 iOS 的代码(有一堆警告说类型不可用)是很麻烦的能够获得一些 IntelliSense。
我怀疑这是一个错误,但很好奇是否有任何解决方法?
编辑:不是一个错误,我只是一个白痴,没有意识到代码编辑器和调试目标不一定是同一个。
我使用默认应用程序在 Visual Studio 中创建了一个新的 MAUI 应用程序。我试图在底部添加一个 TabBar,但它总是出现在顶部(参见屏幕截图)。我见过的所有示例和我读过的文档都表明它应该位于底部。我究竟做错了什么?这是在 Windows 上。
这是AppShell.xaml
<?xml version="1.0" encoding="UTF-8" ?>
<Shell
x:Class="letseat.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:letseat"
>
<TabBar Route="Home">
<Tab Icon="dotnet_bot.png" Title="Main">
<ShellContent ContentTemplate="{DataTemplate local:MainPage}"/>
</Tab>
<Tab Icon="dotnet_bot.png" Title="Profile">
<ShellContent ContentTemplate="{DataTemplate local:ProfilePage}"/>
</Tab>
<Tab Icon="dotnet_bot.png" Title="Test">
<ShellContent ContentTemplate="{DataTemplate local:ProfilePage}"/>
</Tab>
</TabBar>
</Shell>
Run Code Online (Sandbox Code Playgroud)
以及结果 截图
我的 collectionView 中有这段代码:
<RefreshView>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="60" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<CollectionView
ItemsSource="{Binding Comments}"
SelectionMode="Single">
<CollectionView.ItemsLayout>
<LinearItemsLayout Orientation="Vertical" ItemSpacing="5" />
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="model:Comment">
<Frame Style="{StaticResource CardView}" CornerRadius="10">
<Grid RowDefinitions="Auto, Auto, Auto, *" ColumnDefinitions="80, 250" ColumnSpacing="5">
...
</Grid>
</Frame>
</DataTemplate>
</CollectionView.ItemTemplate>
<CollectionView.EmptyView>
<ContentView>
<StackLayout>
<Label
Text="Some text here"
HorizontalOptions="Fill"
HorizontalTextAlignment="Center" />
</StackLayout>
</ContentView>
</CollectionView.EmptyView>
</CollectionView>
<Button
...
</Button>
<Button
...
</Button>
</Grid>
</RefreshView>
Run Code Online (Sandbox Code Playgroud)
奇怪的行为......当我用空集合启动程序时,当然,我看到......什么也没有。无标签。
运行时,我稍微更改文本,无论如何,我在末尾插入一个*,例如:Text =“Some text gone here *”,瞧,突然我的文本在中间正确显示我的屏幕 - 预期的行为!
我在模拟器和Android本地设备中都尝试过。同样的行为。 …