我很清楚 .NET MAUI 只是 Xamarin.Forms 的下一代实现,因此大多数 Xamarin.Forms 指南应该适用于 .NET MAUI(我猜)。
有人让 Admob 在 .NET MAUI 中工作吗?如果是的话,如何实现?我只需要指明正确的方向,我就会上路
我完成了 .NET MAUI 应用程序的编码,并且在调试模式下一切正常。尽管我在 .NET MAUI 上使用它,但 Xamarin 的 Entity Framework Core 满足了我所有的数据持久性需求。
我已经制作了 apk 文件并对其进行测试以查看是否一切正常,但结果发现数据库并未创建。一旦我尝试执行数据库操作,我的应用程序就会崩溃。所以我不确定 EF Core 与 .NET MAUI 是否不兼容(但它在调试中运行良好),或者我错过了一些东西。
我按照此处访问的教程进行操作https://learn.microsoft.com/en-us/ef/core/get-started/xamarin下面是我的 DataContext 文件
数据上下文.cs
using Microsoft.EntityFrameworkCore;
using MedbaseRec.Models;
namespace MedbaseRec.Utils
{
public class DataContext : DbContext
{
public DbSet<QuestionPack> QuestionPacks { get; set; }
public DbSet<Question> Questions { get; set; }
public DataContext()
{
SQLitePCL.Batteries_V2.Init();
Database.EnsureCreated();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string dbPath = Path.Combine(FileSystem.AppDataDirectory, "medbaseapplica.db3");
optionsBuilder.UseSqlite($"Filename={dbPath}");
}
}
}
Run Code Online (Sandbox Code Playgroud) .Net Conf 目前正在进行中,我了解到了名为 Avalonia UI 的东西。(我使用 .NET MAUI)经过一些研究,Avalonia UI 主要是一个桌面 UI 框架,现在支持 Android 和 iOS。
既然它们都是 dotNet 基础项目,为什么它们要开发两个不同的多平台框架?由于它们都使用 XAML 和 C# 代码,因此两者相比是否有明显的优势?
在登录流程中,登录页面通常没有构成应用程序主要流程的底部选项卡。
AppShell.xaml
<TabBar>
<ShellContent Title="Home"
Icon="home.png"
ContentTemplate="{DataTemplate local:HomePage}"/>
<ShellContent Title="Articles"
Icon="articles.png"
ContentTemplate="{DataTemplate local:ArticlesPage}" />
</TabBar>
Run Code Online (Sandbox Code Playgroud)
因此,如果登录成功,我尝试从登录页面导航到作为 Shell 中 TabBar 的一部分的主页。问题是 Shell 然后导航到主页,就好像它是一个独立的页面,没有 TabBar。我假设答案在于导航到 TabBar 部分本身,我不知道。
我有以下内容
<CollectionView Margin="5" ItemsSource="{Binding Subjects}">
<CollectionView.ItemsLayout>
<GridItemsLayout Orientation="Vertical" Span="2" />
</CollectionView.ItemsLayout>
<CollectionView.EmptyView>
<ContentView>
<Label Text="No subjects entered yet..." />
</ContentView>
</CollectionView.EmptyView>
<CollectionView.ItemTemplate>
<DataTemplate>
<Border MaximumWidthRequest="300">
<Border.StrokeShape>
<RoundRectangle CornerRadius="10" />
</Border.StrokeShape>
<Border.GestureRecognizers>
<TapGestureRecognizer Command="{Binding Source={RelativeSource AncestorType={x:Type vm:MainPageViewModel}}, Path=DeleteSubjectCommand}" CommandParameter="{Binding .}" />
</Border.GestureRecognizers>
<Label Margin="5" Text="{Binding .}" />
</Border>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
Run Code Online (Sandbox Code Playgroud)
问题是,<Label Margin="5" Text="{Binding .}" />在我的 .NET MAUI Android 应用程序中,发布时的 是空白的,而在调试时,它已填充并且手势识别器可以工作。当我将项目添加到列表中时,会出现正确的项目数量,因此我认为上面突出显示的标签发生了一些情况。
我该如何解决这个问题?
再会。
在我的所有应用程序中,请求用户权限不会在 Android 中显示权限弹出窗口。
我正在使用 .NET MAUI CommunityToolkit 中的 FileSaver,据我了解,该SaveAsync方法应该请求许可并保存到磁盘。
async Task SaveDocument(MemoryStream memoryStream)
{
try
{
//var fileLocation = await FileSaver.Default.SaveAsync($"{Guid.NewGuid()}.docx", memoryStream, new CancellationToken());
var someLocation = await FileSaver.SaveAsync($"{Guid.NewGuid()}.docx", memoryStream, new CancellationToken());
await Toast.Make($"File is saved: {someLocation}").Show();
}
catch (Exception ex)
{
await Toast.Make($"File is not saved, {ex.Message}").Show();
}
}
Run Code Online (Sandbox Code Playgroud)
catch 语句遇到错误消息权限未授予。
这是我的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true">
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" …Run Code Online (Sandbox Code Playgroud) 我的接收 Viewmodel (QuestionsPageViewModel) 在通过 Shell 导航传递 TopidId 后未收到 TopidId,如下面的代码所示。我已将断点放置在 QuestionsPageViewModel 中的 LoadQuestions 方法处。调用时TopicId为null。我缺少什么?
主页视图模型
//This is in a command executed after clicking a button. And this is working fine
await Shell.Current.GoToAsync($"{nameof(QuestionsPage)}?TopicId={pack.TopicId}");
Run Code Online (Sandbox Code Playgroud)
问题页面视图模型
[INotifyPropertyChanged]
[QueryProperty(nameof(TopicId), nameof(TopicId))]
public partial class QuestionsPageViewModel
{
public ObservableRangeCollection<Question> QuestionsList { get; set; } = new();
[ObservableProperty]
string? title;
[ObservableProperty]
public string topicId;
public QuestionsPageViewModel()
{
LoadQuestions();
}
async void LoadQuestions()
{
Title = Utilities.ConvertTopicIdToString(short.Parse(TopicId));
try
{
using (var context = new DataContext())
{
QuestionPack questionPack = …Run Code Online (Sandbox Code Playgroud) 我想将点击手势识别器与 ICommand 一起使用,这意味着使用 ViewModel 而不是后面的代码。
我正在通过后面的代码使手势识别器工作,如下所示
主页.xaml
<CollectionView Margin="10,0,10,0"
ItemSizingStrategy="MeasureAllItems"
ItemsLayout="VerticalList"
VerticalScrollBarVisibility="Always"
ItemsSource="{Binding QuestionPacks}">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="model:QuestionPack">
<Frame Margin="5"
CornerRadius="10">
<Frame.GestureRecognizers>
<TapGestureRecognizer
Tapped="TapGestureRecognizer_Tapped"/>
<TapGestureRecognizer
NumberOfTapsRequired="2"
Tapped="TapGestureRecognizer_Tapped_1"/>
</Frame.GestureRecognizers>
<VerticalStackLayout Margin="5">
<Label Text="{Binding Topic}" />
<Label Text="{Binding TopicId}" />
</VerticalStackLayout>
</Frame>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
Run Code Online (Sandbox Code Playgroud)
请注意x:DataType=model:QuestionPack数据模板中的 。
主页.xaml.cs
private async void TapGestureRecognizer_Tapped(object sender, EventArgs e)
{
var selectedItem = ((VisualElement)sender).BindingContext as QuestionPack;
if (selectedItem == null)
return;
LoadingQuestions.IsRunning = true;
LoadingQuestions.IsEnabled = true;
await Shell.Current.GoToAsync($"{nameof(QuestionsPage)}?topicSelected={selectedItem.TopicId}");
LoadingQuestions.IsRunning = false;
LoadingQuestions.IsEnabled = false; …Run Code Online (Sandbox Code Playgroud)